版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中北大学程序设计实训说 明 书学 院、系:专 业:学 生 姓 名:学 号:设 计 题 目:学生选修课程系统设计起 迄 日 期:2014年11月21日2015年1月17日指 导 教 师:2015 年 1月 10 日1、 选题要求 假定有n门课程,每门课程有:课程编号,课程名称,课程性质(公共课、必修课、选修课),总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。试设计一选修课程系统,使之能提供以下功能:(1)系统以菜单方式工作(2)课程信息录入功能(课程信息用文件保存) (3)课程信息浏览功能(4)课程信息查询功能,查询方式分两种:按学分查询,
2、按课程性质查询(5)学生选修课程:提示选课成功,按照学生学号查询该生所选课程 考试增加的功能(6) 按照学期进行查询课程信息(7) 判断课程性质为公共课的课程信息显示并存入文件里 注:程序共生成三个文件(选修课程信息文件,公共课文件,学生选课文件)2、 程序设计方法及主要函数介绍 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 Students()/学生信
5、息函数 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; /授课学时 in
6、t 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申请空间 head=t
7、ail=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; /给元素tt
8、ime赋值 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 savefile(
9、)/保存文件 SUB *p; /申明一个SUB型的指针变量p FILE *fp; /fp是指向FILE结构的指针变量 fp=fopen(ZSL.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,p-kind,p-stime,p-t
10、time,p-etime,p-score,p-term); /在文件里写入信息 fclose(fp); /关闭文件 printf(创建后的信息已放入ZSL.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); /在文本的第一行输入该信息 for(p=head;p;p=
11、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,stime,ttime,etime; int score;
12、 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,&newSub-num,newSub-name,newSub-k
13、ind,&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(课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n
14、); 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; head-next=NULL; else for(ptr2=h
15、ead;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; printf(输入要插入的课程信息:n); /以下为元素输入信息 pr
16、intf(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请输入学分:);scanf(%d,&subj-score); print
17、f(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;/申明一个SUB型的指针变量p1,p2 char ch,ch1; int
18、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); printf(n结束删除课程按 0: bb); ch1=g
19、etchar();/将回车键赋给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);/打开文件 printf(请输入要查找的课程性质:); scanf(%
20、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) printf(文件存取失败!);exit(0); fprintf(
21、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);/关闭文件 printf(已把性质为公共课的信息存入文件GonggkI
22、nfor.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-退出查找n); printf(nntt*n); printf(nn请
23、选择(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,ptr-stime,ptr-ttime,ptr-etime,pt
24、r-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,ptr-name,ptr-kind,ptr-stime,ptr
25、-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,ptr-kind,ptr-stime,ptr-ttime,p
26、tr-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); print
27、f(请选择(1-5): bb); scanf(%d,&n); switch(n) case 1:insert();savefile();break; case 2:prin();break; case 3:search();break; case 4:GonggkInfor();break; case 5:return; default:; while(w=1); struct student long int snum;/学生学号 int cnum;/所选课程编号 char cname20;/所选课程名称 ;/定义一个学生结构体 void xuan_ke()/学生选课函数 struct st
28、udent s;/定义学生结构体变量s char C; SUB *c;/定义课程结构体变量cFILE *fp; /fp是指向FILE结构的指针变量printf(n 请输入您的学号及您要选择的课程编号:); scanf(%d %d,&s.snum,&um); fp=fopen(ZSL.txt,r);if(fp=NULL) /打开选课记录文件2.txt printf(nCannot open course!n); while(!feof(fp) if(C=fgetc(fp)=n) break; while(!feof(fp) c=(SUB*)malloc(sizeof(SUB);/给结点申
29、请空间 fscanf(fp,%d %s %s %d %d %d %d %sn,&c-num,c-name,c-kind,&c-stime,&c-ttime,&c-etime,&c-score,&c-term); if(c-num=um) /通过学生选课输入的编号,和选修课程中的编号进行匹配,若匹配成功就结束,并带回当前指针 break; fclose(fp);/关闭选课记录文件ZSL.txt if(fp=fopen(student.txt,a+)=NULL) printf(nCannot open student!n); /将学生选课信息输入student.txt文件 fprintf(
30、fp,%d %d %sn,s.snum,um,c-name);/把选课学生的学号,所选课程编号,课程名称写入文件里 fclose(fp);printf(n 恭喜您选课成功!信息已存入到“student.txt”中。n); system(pause); void xuanke_information()/学生选课信息统计函数 int total=0;/人数统计变量 FILE *fp;/fp是指向FILE结构的指针变量 struct student s;/定义一个student结构体类型的变量s if(fp=fopen(student.txt,r)=NULL)/打开选课记录文件studen
31、t.txt printf(nCannot open student!n); for(;!feof(fp);) printf(ntt 学号 课程编号 课程名称n); fscanf(fp,%d %d %sn,&s.snum,&um,&ame); total+; printf(%22d %17d %18sn,s.snum,um,ame); printf(n 选课学生总人数为:%d人,total); fclose(fp);/关闭文件 system(pause); void Students()/学生信息函数 int n,w=1; do system(cls); prin
32、tf(nntt*学生选课菜单*nn); printf(tttt1-浏览所有课程n); printf(tttt2-选择选修课程n); printf(tttt3-浏览我选修的课程n); printf(tttt4-返回主菜单); printf(nntt*n); printf(请选择(1-4): bb); scanf(%d,&n); switch(n) case 1:prin();break; case 2:xuan_ke();break; case 3:xuanke_information();break; case 4:return; default:; while(w=1); int main(
33、)/主函数 int n,w=1; do system(cls); printf(nnt*学生选课系统*nn); printf(ttt 1.选修课信息n); printf(ttt 2.学生选课n); printf(ttt 3.退出); printf(nnt*n); printf(请选择(1-3): bb); scanf(%d,&n); switch(n) case 1:Mangers();break; case 2:Students();break; case 3:w=0;break; default:; while(w=1); return 0; 4、 程序运行界面 主界面选修课菜单 a录入课程(并存入到ZSL.txt)1. 将所有录入的课程存入ZSL.txt文件b浏览课程c查询课程1. 按学期查找(考试增加功能)2. 按课程性质查找3. 按学分查找d判断并存取公共课课程将公共课的课程信息写入GonggkInfor.txt文件学生选课菜单a学生开始选课将学生选课信息存入student.txt文件b查询学生所选课程返回主菜单生成的三个文件 5、 程序的优点和不足 【程序的优点】算法是程序的灵魂,程序的优点首先表现在算法上的优点,其次才是功能上的。算法上的优点主要体现在以下三点:1. 该程序采用main主函数方式设计,程序的主体的功能大都由该功能完成。程序如此设计有利于程序的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度绿城物业房屋租赁代理合同2篇
- 2024年专业理疗合作协议示范文本
- 2024年国际教育合作协议3篇
- 2024年度版权许可合同:文学作品出版与发行协议2篇
- 二零二四年度可研报告编制合同正规范本3篇
- 2024年建筑二次构造专业协议细则版B版
- 2024年五方股东投资权益保障协议3篇
- 2024年专属产品销售权合同一
- 广告片编剧创作合同
- 2024年公路建设承包商协议3篇
- GB/T 15971-2023导游服务规范
- 幼儿园公开课:大班语言活动《中国功夫》课件
- 营商环境有关知识讲座
- 30题启明星辰售前工程师岗位常见面试问题含HR问题考察点及参考回答
- 技术部门内部管理制度范本
- “双新”视域下培养数学素养的教学实践研究
- 森林防火设备采购投标方案(技术标)
- (完整版)数控铣理论试题题库-有答案和图形
- 20道万华化学研发工程师岗位常见面试问题含HR常问问题考察点及参考回答
- 物业客户关系管理及维护策略
- 中国近现代史纲要社会实践报告十二篇
评论
0/150
提交评论