1、学生选修课程系统设计doc中北大学程序设计实训说 明 书学 院、系:专 业:学 生 姓 名:学 号:设 计 题 目:学生选修课程系统设计起 迄 日 期:2014年11月21日2015年1月17日指 导 教 师:2015 年 1月 10 日一、选题要求 假定有n门课程,每门课程有:课程编号,课程名称,课程性质(公共课、必修课、选修课),总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。试设计一选修课程系统,使之能提供以下功能:(1)系统以菜单方式工作(2)课程信息录入功能(课程信息用文件保存) (3)课程信息浏览功能(4)课程信息查询功能,查询
2、方式分两种:按学分查询,按课程性质查询(5)学生选修课程:提示选课成功,按照学生学号查询该生所选课程 考试增加的功能(6)按照学期进行查询课程信息(7)判断课程性质为公共课的课程信息显示并存入文件里 注:程序共生成三个文件(选修课程信息文件,公共课文件,学生选课文件)二、程序设计方法及主要函数介绍 1.由于C语言是面向过程的语言,所以我的设计思路是根据目标程序运行的过程来编写的。 我具体的设计思路如下: 我设计的是学生选修课管理系统,对选修课程能够进行录入,查询和浏览操作等,并且要求有菜单界面和退出功能。 首先,我考虑到程序的数据优先输入,可以先设置一个选修课登陆界面,然后在该菜单里可进行选修
3、课的录入,查询和浏览操作,最后将录入的课程保存到相应的文件中。然后定义各种函数的功能包括查询(按学期查找,按学分查找,按课程性质查找)操作等。 另一个为学生登陆界面,该菜单学生可以进行课程浏览,课程选择,查询所选课程等操作,最后将学生所选的课程信息存入文件(有学号,课程编号及名称)中。在进行该操作之前需要对选修课程保存的文件进行读取,然后对其中的内容进行查询等,在学生选好课程以后,可以将其选好的课程保存于相应的文件中,以便下次进行查询及修改。 通过函数的层层调用来实现程序的逻辑结构。中间通过文件的打开和关闭实现对文件内部所包含的数据的操作。2.函数介绍如下: 学生选课系统 学生选课菜单 选修课
4、程信息菜单浏览选修课程查询选课结果录入课程并存入查询课程浏览课程存取公共课程学生选课prin()函数GonggkInfor()函数Xuanke()函数insert()函数按学期查询按学分查询按性质查询prin()函数Xuanke_infor()函数search()函数int main()/主函数 void Mangers()/选修课函数 void *insert()/插入课程信息函数 void savefile()/保存文件 void prin() /浏览所有课程函数 void search()/课程信息查询函数 void GonggkInfor()/查询公共课信息函数 void Studen
5、ts()/学生信息函数 void prin() /浏览所有课程函数 void xuan_ke()/学生选课函数 void xuanke_information()/学生选课信息统计函数三、程序源代码(包括注释)#include /字符串处理函数 #include /输入,输出函数#include /动态存储分配函数#include /动态内存分配函数#include typedef struct subjects/定义一个课程的结构体 int num; /课程编号 char name20; /课程名称 char kind10; /课程性质 int stime; /总学时 int ttime;
6、/授课学时 int etime; /实验或上机学时 int score; /学分 char term20; /开课学期 struct subjects *next; /next是指针变量,指向结构体变量 SUB;/定义一个SUB的结构体SUB *head=NULL; /链表的头指针置空 SUB *create_form() /创建链表 SUB *head,*tail,*p; /创建链表的头指针,尾指针 int num,stime,ttime; int etime,score; char name20,kind10,term20; int size=sizeof(SUB);/给结构体SUB申请空
7、间 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
8、; /给元素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;/尾结点的数据域为空 return head; void s
9、avefile()/保存文件 SUB *p; /申明一个SUB型的指针变量p FILE *fp; /fp是指向FILE结构的指针变量 fp=fopen(ZSL1314010731.txt,w);/打开文件 if(fp=NULL) printf(nCannot open the file!n);/打开文件失败 fprintf(fp,课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期n); /在文本的第一行输入该信息 for(p=head;p;p=p-next) fprintf(fp,%5d%12s%9s%9d%9d%11d%11d%11sn,p-num,p-name,
10、p-kind,p-stime,p-ttime,p-etime,p-score,p-term); /在文件里写入信息 fclose(fp); /关闭文件 printf(创建后的信息已放入ZSL1314010731.txt文件中n); system(pause); void savefile1()/保存文件 SUB *p; /申明一个SUB型的指针变量p FILE *fp; /fp是指向FILE结构的指针变量 fp=fopen(3.txt,w); if(fp=NULL) exit(0); fprintf(fp,课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期n); /
11、在文本的第一行输入该信息 for(p=head;p;p=p-next) fprintf(fp,%5d%12s%9s%9d%9d%11d%11d%11sn,p-num,p-name,p-kind,p-stime,p-ttime,p-etime,p-score,p-term); /在文本里写入信息 fclose(fp); /关闭文件 printf(创建后的信息已放入3.txt文件中n); system(pause); void readfile()/阅读文件 void *myInsert(SUB*);/申明该函数 SUB *newSub;/申明一个SUB型的指针变量newSub int num,s
12、time,ttime,etime; int score; char c,name20,kind10,fname20,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%sn,&ne
13、wSub-num,newSub-name,newSub-kind,&newSub-stime,&newSub-ttime,&newSub-etime,&newSub-score,&newSub-term); /在文本里写入信息 myInsert(newSub);/调用该函数 fclose(fp);/关闭文件 void prin() /浏览所有课程函数 readfile();/申明该函数 SUB *ptr;/申明一个SUB型的指针变量ptr head=NULL; if(head=NULL) printf(nnt*NO RECORDS!*n); return; printf(课程编号 课程名称 课
14、程性质 总学时 授课学时 实践或上机学时 学分 开课学期n); for(ptr=head;ptr;ptr=ptr-next) printf(%5d%12s%9s%9d%9d%11d%11d%11sn,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; he
15、ad-next=NULL; else for(ptr2=head;ptr2;ptr2=ptr2-next) if(ptr2-next=NULL) ptr2-next=subj;/连接结点 subj-next=NULL;/下一个结点为空 break; return 0; void *insert()/插入课程信息函数 int size=sizeof(SUB);/申明并给分配内存 char ch,ch1; SUB *ptr,*subj;/申明一个SUB型的指针变量ptr,subj while(ch!=0) subj=(SUB *)malloc(size);/分配内存 ptr=subj; print
16、f(输入要插入的课程信息:n); /以下为元素输入信息 printf(ntt请输入课程编号:);scanf(%d,&subj-num); printf(ntt请输入课程名称:);scanf(%s,&subj-name); printf(ntt请输入课程性质:);scanf(%s,&subj-kind); printf(ntt请输入总学时:);scanf(%d,&subj-stime); printf(ntt请输入授课学时:);scanf(%d,&subj-ttime); printf(ntt请输入实践或上机学时:);scanf(%d,&subj-etime); printf(ntt请输入学分:
17、);scanf(%d,&subj-score); printf(ntt请输入开课学期:);scanf(%s,&subj-term); myInsert(subj); /调用该函数目的是是否继续接受下一个结点 printf(n添加完毕,新信息存入文件中n); printf(n继续插入请按回车n); printf(n结束添加课程按0: bb); ch1=getchar(); /将回车键赋给CH1,否则subj-term输完后输入的回车键会赋给CH,因此用CH1填补。 ch=getchar(); return head; void *del() /删除课程函数 SUB *p1,*p2;/申明一个SU
18、B型的指针变量p1,p2 char ch,ch1; int num; while(ch!=0) printf(输入想要删除的课程编号: bbbbb); scanf(%d,&num); if(head-num=num) p2=head; /以下为删除结点操作 head=head-next; free(p2); if(head=NULL) return NULL; p1=head; p2=head-next; while(p2) if(p2-num=num) p1-next=p2-next; free(p2); else p1=p2; p2=p1-next; printf(n继续删除请按回车n);
19、 printf(n结束删除课程按 0: bb); ch1=getchar();/将回车键赋给CH1,否则num输完后再输入的回车键会赋给CH,因此用CH1填补。 ch=getchar(); printf(n删除完毕,新信息存入文件中n); system(pause); return head; system(pause); void GonggkInfor()/查询公共课信息函数 int t=1; char min20; SUB *ptr;/申明一个SUB型的指针变量ptr FILE *fp;/fp是指向FILE结构的指针变量 fp=fopen(GonggkInfor.txt,w);/打开文件
20、 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%11sn,ptr-num,ptr-name,ptr-kind,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term); t=0; t=1; if(fp=NULL) pri
21、ntf(文件存取失败!); 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%11sn,ptr-num,ptr-name,ptr-kind,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term);/在文本里写入信息 t=0; t=1; fclose(fp);/关闭文
22、件 printf(已把性质为公共课的信息存入文件GonggkInfor.txt里!); system(pause); void search()/课程信息查询函数 int a,num; int t=1; char type10,min10,term10; SUB *ptr; /申明一个SUB型的指针变量ptr L1:system(cls);/清屏功能,每次操作完返回到该功能首菜单 printf(nntt*请选择查询方式*n); printf(nttt1-按学期查找n); printf(nttt2-按课程性质查找n); printf(nttt3-按学分查找n); printf(nttt4-退出查
23、找n); printf(nntt*n); printf(nn请选择(1-4): bb); scanf(%d,&a); switch(a) case 1: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%11sn,ptr-num,ptr-name,ptr-kind,p
24、tr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term); t=0; t=1; system(pause); goto L1;/再次返回到该菜单进行下一个操作 case 2: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%11sn,ptr-num,
25、ptr-name,ptr-kind,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term); t=0; t=1; system(pause); goto L1; case 3: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%11sn,ptr-num,ptr-name
26、,ptr-kind,ptr-stime,ptr-ttime,ptr-etime,ptr-score,ptr-term); t=1; system(pause); goto L1; case 4:break; void Mangers()/选修课函数 int n,w=1,flag=0,j,i=3; do system(cls); /选修课信息菜单 printf(nntt*选修课菜单*nn); printf(tttt 1-录入课程n); printf(tttt 2-浏览课程n); printf(tttt 3-查询课程n); printf(tttt 4-存取公共课课程n); printf(tttt 5-返回主菜单); printf(nntt*n); printf(请选择(1-5): bb); scanf(%d,&n); switch(n) case 1:insert(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1