1、课程设计 计算机学院14060307班 课程设计实验报告课程管理系统计算机科学与工程学院14060307班董永博 14060307102陈佳兴 14060307101田晨光 14060307113赵炳舒 14060307121欧 静 14060307126 目录题目-3分析过程与思路-3算法-5函数模块介绍-9源程序-10运行结果-36课程设计总结-42一 题目课程管理系统二 分析过程与思路课程管理系统首先要能够分别实现课程信息的增加、删除、查询、修改。为了增加程序的实用性,应当能够将输入的课程信息通过存文件的方式将课程信息存入硬盘。而使用系统的可能是学生和管理员两类,因此要实现根据登录类型来
2、开放应有的功能。由于课程信息包含很多成员,例如课程编码、课程名等。因此应该用链表对信息进行记录,由于不清楚课程总数,因此需要用动态链表。动态链表的使用需要声明合适的结构体,数据域中应包含课程所包含的各个成员、指针域用来指向下一个结点。动态链表的建立需要用到malloc函数。对已经建立的链表需要存入文件,需要用到fwrite、fread、feof等文件处理函数,保存文件要多次用到,因此应该独立做一个函数。删除函数要用到诸如free函数,为了防止删除的结点为首结点,删除后找不到头结点,因此删除函数应该是一个指针函数,用以返回删除后的新的头结点。登录函数要返回一个值用以在其他函数中判断登录类型,以便
3、针对用户开放相应的功能。课程管理系统登录key学生登录mainpage()管理员登陆mainpage()查询serch()查询serch()输入inpt()添加add()删除dele()修改alter()程序功能结构示意图三 算法NY21开始输入登录类型oO=?学生登录管理员登录mainpage()key函数简单算法字符串相等1输入mm=?serch()退出inpt()结束O=?mainpage函数算法简单示意Save函数21!17&!2开辟新节点输入新节点数据输入zz=?inpt函数算法简单示意开辟新节点结点相连YNYNYNYserch函数查看方式n=0?打开文件文件为空开辟结点读取文件数据
4、已读完文件为空Mainpage函数输出一个结点完毕?查询方式结点遍历查找输出重新?操作?添加add修改alter删除deleSerch函数算法简单示意NY输入数据满足条件异常处理示意p1-前一结点p2-当前结点p1-next=p2删除首结点head=p1-nextfree(p2)return(head)free(p1)删除函数简单示意四 函数模块介绍void inpt();/输入函数:用以输入一系列数据,在文件中没有课程信息数据或者需要全部更新时使用该函数模块。void serch();/查询函数,用以查询已经存储的课程信息。并通过调用其他函数,来对课程信息进行一系列操作。void alter
5、(int all,int b,lesson *head);/修改函数,用以小规模的修改已经存储的课程信息。lesson *dele(int all,int b,lesson *head);/删除函数,用以删除一些已经失效了的课程信息。通过返回新链表的头指针,以便对新链表进行一系列操作。void save(int n,lesson *p);/保存函数,用以将已经建立的链表存入硬盘,便于随时使用。void output(struct lesson *q2);/输出函数,用以将课程信息输出到屏幕上显示出来。void add(int all,lesson *head);/添加,用以在原课程信息的基础上
6、添加新的课程信息。void mainpage();/主界面函数int key();/登录函数,通过返回值来判断用户类型,以开放不同的功能。五 源程序#include#include#include#define len sizeof(struct lesson)#define print printf(输入数据有误,请重新输入!n);int n,temp,o;struct lessonchar num5;/课程编码char proj10;/课程名char crdt4;/学分char hour3;/学时char term2;/学期char week5;/周次char date5;/周日期(周几)
7、char period5;/节次char room6;/教室struct lesson *next;/结构体指针;void inpt();/输入函数void serch();/查询函数void alter(int all,int b,lesson *head);/修改函数lesson *dele(int all,int b,lesson *head);/删除函数void save(int n,lesson *p);/保存函数void output(struct lesson *q2);/输出函数void add(int all,lesson *head);/添加void mainpage();
8、/主界面函数int key();/登录函数int main()/14060307113 田晨光o=key();/调用登录函数mainpage();/调用主界面 return 0;void mainpage()/主界面函数 14060307101董永博int m=1;while(m=1)printf(*n);/ printf(* 输入1增加课程 *n); printf(* 输入2查询课程 *n); printf(* 输入3退出程序 *n); printf(*nn);doscanf(%d,&m);if(m3) print;/该循环体使用户输入选项代码并判断代码是否合理while(m3); syst
9、em(CLS);/清除屏幕内容 switch(m)/通过switch语句转向用户选择的功能函数 case 1:inpt();break;/调用输入函数 case 2:serch();break;/调用查询函数 case 3:exit(0);break;/退出void inpt()/输入函数14060307113 田晨光if(o=1)system(CLS);/清屏printf(没有权限,请联系管理员!n);mainpage();int k=1,z,x,i;struct lesson *head;/声明一个lesson类型的结构体指针,作为头指针。struct lesson *p1,*p2;/声明
10、两个lesson类型的结构体指针,建造链表。p1=p2=(struct lesson *)malloc(len);/使两个结构体指针都指向第一个节点n=0;/n用来从零开始记录当前为第几节点 while(k=1)/循环输入n=n+1;/循环体每执行一次使n加1printf(请输入课程编码(1-4位字符串 例:001)n);/输入数据doscanf(%s,&p1-num);if(strlen(p1-num)4) print;while(strlen(p1-num)4);printf(请输入课程名(1-10位字符串 例:math)n);doscanf(%s,&p1-proj);if(strlen(
11、p1-proj)10) print; while(strlen(p1-proj)10);printf(请输入学分(两位实数,整数部分1位,小数部分1位,例:1.5)n);dox=0;scanf(%s,&p1-crdt);if(strlen(p1-crdt)4) print;elsefor(i=0;icrdt)i57|(p1-crdt)icrdt)4|x=1);printf(请输入学时(两位整数 例:32)n);dox=0;scanf(%s,&p1-hour);if(strlen(p1-hour)3) print;elsefor(i=0;ihour)i57|(p1-hour)ihour)3|x=
12、1);printf(请输入学期(以为整数 例:2)n);dox=0;scanf(%s,&p1-term);if(strlen(p1-term)2) print;elsefor(i=0;iterm)i57|(p1-term)iterm)2|x=1);printf(请输入周次(例1-17)n);doscanf(%s,&p1-week);if(strlen(p1-week)5) print; while(strlen(p1-week)5); printf(请输入日期(三位周日期 例:mon、sat)n);doscanf(%s,&p1-date);if(strlen(p1-date)3) print;
13、 while(strlen(p1-date)3); printf(请输入节次(例:5-6)n);doscanf(%s,&p1-period);if(strlen(p1-period)5) print; while(strlen(p1-period)5);printf(请输入教室(例:2-201)n);doscanf(%s,&p1-room);if(strlen(p1-room)6) print; while(strlen(p1-room)6);if(n=1) head=p1;/如果n=1,(即当前为第一个节点),就使head指向头结点,作为头指针。system(CLS);/输入完毕,清屏pri
14、ntf(*n);/输出提示信息printf(* 输入1继续添加 *n); printf(* 输入2保存并退出 *n); printf(*n);doscanf(%d,&z);if(z2) print;/该循环体使用户输入选项代码并判断代码是否合理while(z2); if(z=1)/如果用户选择继续添加,进入该分支p1=(struct lesson *)malloc(len);/利用malloc函数,开辟一个新节点 (p2-next)=p1;/令前一个结构体的next指针指向后一个节点,将两个结构体链接起来p2=p1;/令另一个指针也指向下一个节点,便于下次使用else/如果用户选择保存并退出选
15、项,进入该分支。 (p2-next)=NULL;/令最后一个节点的next指针指向NULL; break;/跳出循环n=0-1;save(n,head);/调用save函数,将已经建立的链表存入文件mainpage();/返回主界面void save(int m,lesson *p)/save函数,将数据保存到硬盘的文件中 14060307126欧静FILE *fp;/声明一个文件指针lesson *p1=p;/声明一个结构体指针fp=fopen(D:data.txt,wb);/以写为目的打开D:data.txt路径下的二进制文件while(p-next!=NULL)/当指针p指向的节点中的n
16、ext指针不为空时(证明没有保存完毕),进入循环体 if(fwrite(p,len,1,fp)!=1) printf(保存文件失败!n);/用fwrite函数的返回值来反映是否成功保存每一个节点 else printf(保存文件成功!n);p=p1-next;/使结构体指针指向下一个节点;p1=p;if(p-next=NULL&n=-1)if(fwrite(p,len,1,fp)!=1) printf(保存文件失败!n);/用fwrite函数的返回值来反映是否成功保存每一个节点 else printf(保存文件成功!n); fclose(fp);/关闭文件void serch()/查询函数(包
17、含节点的删除与修改)14060307102 董永博int i,k,m,j=1;/声明一些需要用到的变量char p10;/声明一个字符型数组,用以存放用户输入的需要查询的相关信息struct lesson *q1,*q2,*head=NULL;/声明读取链表所需要的三个结构体指针FILE *fp;/声明一个文件指针do fp=fopen(D:data.txt,rb);/以读取为目的打开D:data.txt路径下的二进制文件 if(ferror(fp) clearerr(fp);/如果打开文件错误,立即清除错误后产生的标记,便于文件下次正常打开 if(fp=NULL)/如果文件指针指向NULL(
18、代表该文件不存在)则进入该分支 printf(无法打开文件!n); exit(0); q1=q2=(struct lesson *)malloc(len);/文件打开后,在内存中开辟空间,存放文件读取到的数据 fread(q1,len,1,fp);/读取第一个节点 if(feof(fp)/用feof函数的返回值来判断该文件是否为空文件 printf(没有存储课程信息!n); mainpage(); q2=q1;/两个指针同时指向第一个节点 m=0;/将m 清零,便于接下来记录节点总数 while(!feof(fp)/利用feof函数的返回值来判断文件是否读取完毕 m=m+1;/记录节点数 if
19、(m=1)head=q1;/如果为第一个节点,使head指针指向该节点 q1=(struct lesson *)malloc(len);/继续开辟下一个节点 q2-next=q1;/将新节点与上一个节点链接起来 q2=q1; fread(q1,len,1,fp);/读取文件内容,存入新节点 q2-next=NULL;/文件读取完毕后,令链表的最后一个节点的next指针指向NULL q1=q2=head;/两个结构体指针重新指向头结点printf(*n);/输出提示信息 printf(* 输入0查看全部课程 *n); printf(* 输入1按课程名查询 *n); printf(* 输入2按课程
20、编码查询 *n); printf(* 输入3按周日期查询 *n); printf(* 输入4按起始周查询 *n);printf(* 输入5返回主界面 *n); printf(*nn); do scanf(%d,&k); if(k5) print; while(k5); switch(k) case 0:/当用户选择查看全部课程信息时,进入该分支printf(课程编码 课程名 学分 学时 学期 周次 日期 节次 教室n); for(i=1;inext;/指针指向下一个结点 q2=q1;q2-next=NULL; break; case 1:/当用户选择按课程名查询时,进入该分支 printf(请
21、输入课程名!(1-10位字符串 例:math)n); do scanf(%s,&p); if(strlen(q1-proj)10) print; while(strlen(q1-proj)10);/输入要查询的课程名 temp=0;/将temp归零,便于记录所查询到的节点为第几节点,便于下面修改函数和删除函数的查找 do if(!strcmp(q2-proj,p)/通过字符串比较来查找需要查找的信息 temp=temp+1;/记录节点数 printf(查询到%s相关的课程信息为:nn,p);printf(课程编码 课程名 学分 学时 学期 周次 日期 节次 教室n); output(q2);/
22、调用输出函数 break;/跳出循环 else/如果内容与用户输入字符串不相等,查找下一个节点j=j+1; q1=q2-next; q2=q1; while(q2-next!=NULL); if(temp=0) printf(未查询到相关课程!n);/如果temp等于零,则代表没有查询到相关信息elseprintf(*n);/如果查询到相关课程 printf(* 输入0修改课程信息 *n); printf(* 输入1删除课程信息 *n);printf(* 输入2添加课程信息 *n);printf(*n);do scanf(%d,&k); if(k2) print; while(k2);if(o
23、=1) printf(对不起,您没有权限!请联系管理员!n);/如果学生登录,由于key函数返回值为1,就不开放删除修改功能else/如果是管理员登录,则可以使用删除,修改,添加等功能switch(k)/通过管理员的选择代码,分别调用不同的函数 case 0:alter(m,j,head);break;/调用修改函数,将查询到的课程的位置,链表的总节点数。链表的头指针传给函数 case 1:head=dele(m,j,head);break;/调用删除函数,将返回的指针作为下一次打开的头指针 case 2:add(m,head);break;/调用添加函数,在链表的后面继续添加 break;
24、case 2: printf(请输入课程编码(1-4位字符串 例:001)n);/输入数据 do scanf(%s,&p); if(strlen(q1-num)4) print; while(strlen(q1-num)4); temp=0; do if(!strcmp(q2-num,p) temp=temp+1; printf(查询到编码为%s的课程信息为:nn,p);printf(课程编码 课程名 学分 学时 学期 周次 日期 节次 教室n); output(q2); break; elsej=j+1; q1=q2-next; q2=q1; while(q2-next!=NULL); if
25、(temp=0) printf(未查询到相关课程!n);elseprintf(*n); printf(* 输入0修改课程信息 *n); printf(* 输入1删除课程信息 *n); printf(* 输入2添加课程信息 *n);printf(*n);do scanf(%d,&k); if(k2) print; while(k2);if(o=1) printf(对不起,您没有权限!请联系管理员!n);elseswitch(k) case 0:alter(m,j,head);break; case 1:head=dele(m,j,head);break; case 2:add(m,head);b
26、reak; break; case 3: printf(请输入周日期!(三位周日期 例:mon、sat)n); do scanf(%s,&p); if(strlen(q1-date)3) print; while(strlen(q1-date)3); temp=0; do if(!strcmp(q2-date,p)temp=temp+1; printf(查询到%s的课程信息为:nn,p);printf(课程编码 课程名 学分 学时 学期 周次 日期 节次 教室n); output(q2); break; elsej=j+1; q1=q2-next; q2=q1; while(q2-next!=
27、NULL); if(temp=0) printf(未查询到相关课程!nn);elseprintf(*n); printf(* 输入0修改课程信息 *n); printf(* 输入1删除课程信息 *n);printf(* 输入2添加课程信息 *n);printf(*n);do scanf(%d,&k); if(k2) print; while(k2);if(o=1) printf(对不起,您没有权限!请联系管理员!n);elseswitch(k) case 0:alter(m,j,head);break; case 1:head=dele(m,j,head);break; case 2:add(
28、m,head);break; break; case 4: printf(请输入起始周(例1-17)!n); do scanf(%s,&p); if(strlen(q1-week)5) print; while(strlen(q1-week)5); temp=0; do if(!strcmp(q2-week,p)temp=temp+1; printf(查询到%s周的课程信息为:nn,p);printf(课程编码 课程名 学分 学时 学期 周次 日期 节次 教室n); output(q2); break; elsej=j+1; q1=q2-next; q2=q1; while(q2-next!=NULL); if(temp=0) printf(未查询到相关课程!n);elseprintf(*n); printf(* 输入0修改课程信息 *n); printf(* 输入1删除课程信息 *n);
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100