学生选修课程系统设计doc.docx
《学生选修课程系统设计doc.docx》由会员分享,可在线阅读,更多相关《学生选修课程系统设计doc.docx(34页珍藏版)》请在冰豆网上搜索。
![学生选修课程系统设计doc.docx](https://file1.bdocx.com/fileroot1/2023-4/17/6449d6eb-2f77-4ceb-95b7-a1169a0d3e70/6449d6eb-2f77-4ceb-95b7-a1169a0d3e701.gif)
学生选修课程系统设计doc
中北大学
程序设计实训
说明书
学院、系:
专业:
学生姓名:
学号:
设计题目:
学生选修课程系统设计
起迄日期:
2014年11月21日~2015年1月17日
指导教师:
2015年1月10日
一、选题要求
假定有n门课程,每门课程有:
课程编号,课程名称,课程性质(公共课、必修课、选修课),总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。
试设计一选修课程系统,使之能提供以下功能:
(1)系统以菜单方式工作
(2)课程信息录入功能(课程信息用文件保存)
(3)课程信息浏览功能
(4)课程信息查询功能,查询方式分两种:
按学分查询, 按课程性质查询
(5)学生选修课程:
提示选课成功,按照学生学号查询该生所选课程
考试增加的功能
(6)按照学期进行查询课程信息
(7)判断课程性质为公共课的课程信息显示并存入文件里
注:
程序共生成三个文件(选修课程信息文件,公共课文件,学生选课文件)
二、程序设计方法及主要函数介绍
1.由于C语言是面向过程的语言,所以我的设计思路是根据目标程序运行的过程来编写的。
我具体的设计思路如下:
我设计的是学生选修课管理系统,对选修课程能够进行录入,查询和浏览操作等,并且要求有菜单界面和退出功能。
首先,我考虑到程序的数据优先输入,可以先设置一个选修课登陆界面,然后在该菜单里可进行选修课的录入,查询和浏览操作,最后将录入的课程保存到相应的文件中。
然后定义各种函数的功能包括查询(按学期查找,按学分查找,按课程性质查找)操作等。
另一个为学生登陆界面,该菜单学生可以进行课程浏览,课程选择,查询所选课程等操作,最后将学生所选的课程信息存入文件(有学号,课程编号及名称)中。
在进行该操作之前需要对选修课程保存的文件进行读取,然后对其中的内容进行查询等,在学生选好课程以后,可以将其选好的课程保存于相应的文件中,以便下次进行查询及修改。
通过函数的层层调用来实现程序的逻辑结构。
中间通过文件的打开和关闭实现对文件内部所包含的数据的操作。
2.函数介绍如下:
学生选课系统
学生选课菜单
选修课程信息菜单
浏览选修课程
查询选课结果
录入课程
并
存入
查询课程
浏览课程
存取公共课程
学生选课
prin()函数
GonggkInfor()函数
Xuanke()函数
insert()函数
按学期查询
按学分查询
按性质查询
prin()函数
Xuanke_infor()函数
search()函数
intmain()//主函数
voidMangers()//选修课函数
void*insert()//插入课程信息函数
voidsavefile()//保存文件
voidprin()//浏览所有课程函数
voidsearch()//课程信息查询函数
voidGonggkInfor()//查询公共课信息函数
voidStudents()//学生信息函数
voidprin()//浏览所有课程函数
voidxuan_ke()//学生选课函数
voidxuanke_information()//学生选课信息统计函数
三、程序源代码(包括注释)
#include//字符串处理函数
#include//输入,输出函数
#include//动态存储分配函数
#include//动态内存分配函数
#include
typedefstructsubjects{//定义一个课程的结构体
intnum;//课程编号
charname[20];//课程名称
charkind[10];//课程性质
intstime;//总学时
intttime;//授课学时
intetime;//实验或上机学时
intscore;//学分
charterm[20];//开课学期
structsubjects*next;//next是指针变量,指向结构体变量
}SUB;//定义一个SUB的结构体
SUB*head=NULL;//链表的头指针置空
SUB*create_form()//创建链表
{
SUB*head,*tail,*p;//创建链表的头指针,尾指针
intnum,stime,ttime;
intetime,score;
charname[20],kind[10],term[20];
intsize=sizeof(SUB);//给结构体SUB申请空间
head=tail=NULL;//先让头指针和为指针置空
printf("输入选修课程信息:
\n");
scanf("%d%s%s%d%d%d%d%s",&num,name,kind,&stime,&ttime,&etime,&score,&term);
while(num!
=0){
p=(SUB*)malloc(sizeof(SUB));//给结点p申请内存
p->num=num;//给元素num赋值
strcpy(p->name,name);//给元素name赋值
strcpy(p->kind,kind);//给元素kind赋值
p->stime=stime;//给元素stime赋值
p->ttime=ttime;//给元素ttime赋值
p->etime=etime;//给元素etime赋值
p->score=score;//给元素score赋值
strcpy(p->term,term);//给元素term赋值
if(head==NULL)
head=p;//若头指针为空,把结点p赋值给头指针
else
tail->next=p;//否则把p赋值给尾指针指向下一个结点
tail=p;scanf("%d%s%s%d%d%d%%s",&num,name,kind,&stime,&ttime,&etime,&score,term);
}
tail->next=NULL;//尾结点的数据域为空
returnhead;
}
voidsavefile()//保存文件
{
SUB*p;//申明一个SUB型的指针变量p
FILE*fp;//fp是指向FILE结构的指针变量
fp=fopen("ZSL1314010731.txt","w");//打开文件
if(fp==NULL)
{
printf("\nCannotopenthefile!
\n");//打开文件失败
}
fprintf(fp,"课程编号课程名称课程性质总学时授课学时实验或上机学时学分开课学期\n");//在文本的第一行输入该信息
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%11s\n",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term);//在文件里写入信息
fclose(fp);//关闭文件
printf("创建后的信息已放入'ZSL1314010731.txt'文件中\n");
system("pause");
}
voidsavefile1()//保存文件
{
SUB*p;//申明一个SUB型的指针变量p
FILE*fp;//fp是指向FILE结构的指针变量
fp=fopen("3.txt","w");
if(fp==NULL)exit(0);
fprintf(fp,"课程编号课程名称课程性质总学时授课学时实验或上机学时学分开课学期\n");//在文本的第一行输入该信息
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%11s\n",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term);//在文本里写入信息
fclose(fp);//关闭文件
printf("创建后的信息已放入'3.txt'文件中\n");
system("pause");
}
voidreadfile()//阅读文件
{
void*myInsert(SUB*);//申明该函数
SUB*newSub;//申明一个SUB型的指针变量newSub
intnum,stime,ttime,etime;
intscore;
charc,name[20],kind[10],fname[20],term;
printf("请输入课程信息所在的文件名称:
");
scanf("%s",fname);
FILE*fp;//fp是指向FILE结构的指针变量
fp=fopen(fname,"r");//打开文件
while(!
feof(fp)){//判断文件是否到了结尾
if((c=fgetc(fp))=='\n')break;
}
while(!
feof(fp)){
newSub=(SUB*)malloc(sizeof(SUB));//给结点p申请内存
fscanf(fp,"%d%s%s%d%d%d%d%s\n",&newSub->num,newSub->name,newSub->kind,&newSub->stime,&newSub->ttime,&newSub->etime,&newSub->score,&newSub->term);//在文本里写入信息
myInsert(newSub);//调用该函数
}
fclose(fp);//关闭文件
}
voidprin()//浏览所有课程函数
{
readfile();//申明该函数
SUB*ptr;//申明一个SUB型的指针变量ptr
head=NULL;
if(head==NULL){
printf("\n\n\t*********NORECORDS!
************\n");
return;
}
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next){
printf("%5d%12s%9s%9d%9d%11d%11d%11s\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
}
system("pause");
}
void*myInsert(SUB*subj)//链表插入操作
{
SUB*ptr,*ptr2;//申明一个SUB型的指针变量ptr,ptr2
ptr=subj;
if(head==NULL)
{
head=ptr;
head->next=NULL;
}
else{
for(ptr2=head;ptr2;ptr2=ptr2->next)
if(ptr2->next==NULL)
{
ptr2->next=subj;//连接结点
subj->next=NULL;//下一个结点为空
break;
}
}
return0;
}
void*insert()//插入课程信息函数
{
intsize=sizeof(SUB);//申明并给分配内存
charch,ch1;
SUB*ptr,*subj;//申明一个SUB型的指针变量ptr,subj
while(ch!
='0')
{
subj=(SUB*)malloc(size);//分配内存
ptr=subj;
printf("输入要插入的课程信息:
\n");//以下为元素输入信息
printf("\n\t\t请输入课程编号:
");scanf("%d",&subj->num);
printf("\n\t\t请输入课程名称:
");scanf("%s",&subj->name);
printf("\n\t\t请输入课程性质:
");scanf("%s",&subj->kind);
printf("\n\t\t请输入总学时:
");scanf("%d",&subj->stime);
printf("\n\t\t请输入授课学时:
");scanf("%d",&subj->ttime);
printf("\n\t\t请输入实践或上机学时:
");scanf("%d",&subj->etime);
printf("\n\t\t请输入学分:
");scanf("%d",&subj->score);
printf("\n\t\t请输入开课学期:
");scanf("%s",&subj->term);
myInsert(subj);//调用该函数目的是是否继续接受下一个结点
printf("\n添加完毕,新信息存入文件中\n");
printf("\n继续插入请按回车\n");
printf("\n结束添加课程按0:
[]\b\b");
ch1=getchar();//将回车键赋给CH1,否则subj->term输完后输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
}
returnhead;
}
void*del()//删除课程函数
{
SUB*p1,*p2;//申明一个SUB型的指针变量p1,p2
charch,ch1;
intnum;
while(ch!
='0'){
printf("输入想要删除的课程编号:
[]\b\b\b\b\b");
scanf("%d",&num);
if(head->num==num){
p2=head;//以下为删除结点操作
head=head->next;
free(p2);
}
if(head==NULL)returnNULL;
p1=head;
p2=head->next;
while(p2){
if(p2->num==num){
p1->next=p2->next;
free(p2);
}
elsep1=p2;
p2=p1->next;
}
printf("\n继续删除请按回车\n");
printf("\n结束删除课程按0:
[]\b\b");
ch1=getchar();//将回车键赋给CH1,否则num输完后再输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
printf("\n删除完毕,新信息存入文件中\n");
system("pause");
}
returnhead;
system("pause");
}
voidGonggkInfor()//查询公共课信息函数
{
intt=1;
charmin[20];
SUB*ptr;//申明一个SUB型的指针变量ptr
FILE*fp;//fp是指向FILE结构的指针变量
fp=fopen("GonggkInfor.txt","w");//打开文件
printf("请输入要查找的课程性质:
");
scanf("%s",min);
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
{
if(strcmp(min,ptr->kind)==0)//通过比较两个字符串来进行实现
{
printf("%5d%12s%9s%9d%9d%11d%11d%11s\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}
t=1;
}
if(fp==NULL)
{
printf("文件存取失败!
");
exit(0);
}
fprintf(fp,"课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");//在文本的第一行输入该信息
for(ptr=head;ptr;ptr=ptr->next)
if(strcmp(min,ptr->kind)==0)
{
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%11s\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);//在文本里写入信息
t=0;
}
t=1;
fclose(fp);//关闭文件
printf("已把性质为公共课的信息存入文件‘GonggkInfor.txt’里!
");
system("pause");
}
voidsearch()//课程信息查询函数
{
inta,num;
intt=1;
chartype[10],min[10],term[10];
SUB*ptr;//申明一个SUB型的指针变量ptr
L1:
system("cls");//清屏功能,每次操作完返回到该功能首菜单
printf("\n\n\t\t**********请选择查询方式*************\n");
printf("\n\t\t\t1---按学期查找\n");
printf("\n\t\t\t2---按课程性质查找\n");
printf("\n\t\t\t3---按学分查找\n");
printf("\n\t\t\t4---退出查找\n");
printf("\n\n\t\t**************************************\n");
printf("\n\n请选择(1-4):
[]\b\b");
scanf("%d",&a);
switch(a){
case1:
printf("请输入要查找的课程学期:
");
scanf("%s",min);
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
{
if(strcmp(min,ptr->term)==0)//通过比较两个字符串来进行实现
{
printf("%5d%12s%9s%9d%9d%11d%11d%11s\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}t=1;
}
system("pause");
gotoL1;//再次返回到该菜单进行下一个操作
case2:
printf("请输入要查找的课程的性质:
");
scanf("%s",type);
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
{
if(strcmp(type,ptr->kind)==0)
{
printf("%5d%12s%9s%9d%9d%11d%11d%11s\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}t=1;
}
system("pause");
gotoL1;
case3:
printf("输入要查找的课程的学分:
");
scanf("%d",&num);
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
{
if(ptr->score==num)
{
printf("%5d%12s%9s%9d%9d%11d%11d%11s\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
t=1;
}
system("pause");
gotoL1;
case4:
break;
}
}
voidMangers()//选修课函数
{
intn,w=1,flag=0,j,i=3;
do{
system("cls");//选修课信息菜单
printf("\n\n\t\t*********************选修课菜单***********************\n\n");
printf("\t\t\t\t1---录入课程\n");
printf("\t\t\t\t2---浏览课程\n");
printf("\t\t\t\t3---查询课程\n");
printf("\t\t\t\t4---存取公共课课程\n");
printf("\t\t\t\t5---返回主菜单");
printf("\n\n\t\t******************************************************\n");
printf("请选择(1-5):
[]\b\b");
scanf("%d",&n);
switch(n)
{
case1:
insert(