C语言课程设计课程管理系统实验报告_第1页
C语言课程设计课程管理系统实验报告_第2页
C语言课程设计课程管理系统实验报告_第3页
C语言课程设计课程管理系统实验报告_第4页
C语言课程设计课程管理系统实验报告_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计实验报告课程管理系统计算机科学与工程学院14060307班董永博1406030710陈佳晨炳录题目 3分析过程与思路 -3算法. 5函数模块介绍9源程序 10运行结果 36课程设计总结 42题目 课程管理系统分析过程与思路课程管理系统首先要能够分别实现课程信息的增加、删除、查询、修改。为了增加程序的实用性,应当能够将输入的课程 信息通过 存文件的方式将课程信息存入硬盘。而使用系统的可 能是学生和管理 员两类,因此要实现根据登录类型来开放应有 的功能。由于课程信息包含很多成员,例如课程

2、编码、课程名等。因此应该用链表对信息进行记录,由于不清楚课程总数,因此 需要用动态 链表。动态链表的使用需要声明合适的结构体,数 据域中应包含课程 所包含的各个成员、指针域用来指向下一个结点。动态链表的建立需 要用到malloc函数。对已经建立的链表需要存入文件,需要用到fwrite、fread、feof等文件处理函数,保存文件要多次用到,因此应该独立做一个函 数。删除函数要用到诸如free函数,为了防止删除的结点为首结点,删除后找不到头结点,因此删除函数应该是一个指针函数,用以 返回删除后的新的头结点。登录函数要返回一个值用以在其他函数中判断登录类型,以便针对用户幵放相应的功能。f课程管理系

3、统八录key管理员登陆main page()J学牛登录main page()Lj查询serch()j查询输入in pt()添加 add()修改alter()厂 删除 dele()程序功能结构示意图三算法开始-H key函数简单算法Y1学生登录管理员登录main page()Ifinpt函数算法简中小意 11卩Save函数serch函数四.函数模块介绍void inpt(); 7/输入函数:用以输入一系列数据,在文件中没有课程信息数据或者需要全部更新时使用该函数模块。void serch(); 查询函数,用以查询已经存储的课程信息。 并通过调用其他函数,来对课程信息进行一系列操作。void al

4、ter(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); 添加,用以在原课程信息

5、的基础上添加新的课程信息。void main page(); 主界面函数int key(); 登录函数,通过返回值来判断用户类型,以开放 不同的功能。五.源程序# nclude#i nclude#i nclude#defi ne len sizeof(struct less on)#define print printf(”输入数据有误,请重新输入! nn);int n,temp。struct less onchar num 5;/ 课程编码char proj10; 课程名char crdt4; / 学分char hour3; 学时char term2; / 学期char week5; / 周

6、次chardate5;/ 周日期(周几)char period5; 节次char room6;/ 教室 struct lesson *n ext;/结构体指针;void in pt();/ 输入函数void serch(); 查询函数void alter(int all,int bjesson *head);/修改函数 lesson *dele(i nt all,i nt b,less on *head); 删除函数 void save(i nt n,l ess on *p); 保存函数 void output(struct lesson *q2);/输出函数 void add(i nt al

7、ljesso n *head);/添 加 void mai npage(); /主界面函数int key();登录函数int ma in ()/714060307113 田晨光o=key();/调用登录函数main page();/调用主界面 return 0;void mai npage() 主界面函董永博int m=1;while(m=1)Iprin ,*pj. /prin tf(n*输入1增加课程*nH);prin tf(H*输入2查询课程*nn);prin tf(H*输入3退出程序*nH);prin ,*p|pjn .doscan f(”d”,&m);if(m

8、3) print;/该循环体使用户输入选项代码并判断代 码 是否合理while(m3);system(”CLS”); 清除屏幕内容switch(m)/通过switch语句转向用户选择的功能函数case 1:i npt();break;/调用输入函数 case 2:serch();break;iM 用查询函数case 3:exit(0);break;/退出void in pt()/ 输入函数田晨光if(o=1)system(CLS);/ 清屏printf没有权限,请联系管理员!rf); main page();int k=1, z, xj;struct lesson *

9、head;/声明一个lesson类型的结构体指针,作为头指针。 struct lesson *p1,*p2; /声明两个lesson类型的结构体指针,建造链表。 p1=p2=(struct lesson *)malloc(le n); 使两个结构体指针都指向第一个节点n=0;/n用来从零开始记录当前为第几节点while(k=1) / 循环输入n=n+1 ;循环体每执行一次使n加1printf(“请输入课程编码(14位字符串例:001)rT);输入数据doscan f(n%s,&p1- nu m); if(strle n( p1- num)4) print;while(strle n( p1 n

10、u m)4);printf(”请输入课程名(*M0位字符串 例:math) nn); doscan f(n%sn,&p1-proj); if(strle n( p1-proj)10) print;while(strle n(p1-proj)10);printf(“请输入学分(两位实数,整数部分1位,小数部分1位, 例:1.5)nn);dox=0;scan f(H%s,&p1-crdt);if(strle n(p1-crdt)4)print; elsefor(i=0;icrdt)i57|(p1 -crdt)icrdt)4|x=1);printf(H请输入学时(两位整数例:32)nH);dox=0

11、;scan f(n%sn,&p1-hour);if(strle n( p1-hour)3)print;elsefor(i=0;ihour)i57|(p1-hour)ihour)3|x=1);printf(“请输入学期(以为整数例:2) rf);dox=0;scan f(”s”,&p1term);if(strle n( p1-term)2)print;elsefor(i=0;iterm)i57|(p1-term)iterm)2|x=1);printf(“请输入周次(例 1-17) n);doscan f(%s,&p1-week); if(strle n( p1-week)5) print; wh

12、ile(strle n(p1-week)5);printf(”请输入日期(三位周日期 例:mon、sat)nH);doscan f(%s&p1-date); if(strle n( p1-date)3) print; while(strle n( p1-date)3);printf(H请输入节次(例:5-6 )n); doscan f(H%sn,&p1 -period); if(strle n( p1-period)5) print;while(strle n( p1period)5);printf(M请输入教室(例:2-201) nH); doscan f(%s,&p1room); if(s

13、trle n( p1room)6) print;while(strle n( ploroom)6);if(n=1) head=p1; /如果n=1,(即当前为第一个节点),就使head指 向头结点,作为头指针。system(CLS,); 输入完毕,清屏输入1继续添加输入2保存并退出才才*/* 才才* 才*才* 丄 4, |.n );printf(* * *nM)/ 输出提示信息*nn);*nn);prin tf(H*prin print do scan f(”d”,&z);if(z2) print;/该循环体使用户输入选项代码并判断代码是否合理 while(z2);if(z=T)如果用户选择继

14、续添加,进入该分支 p1=(struct lesson *)malloc(len);/ 利用 malloc 函数、开辟一个 新 节点(p2-next)=p1; /令前一个结构体的next指针指向后一个节 点,将两个结构体链接起来p2=p1: /令另一个指针也指向下一个节点,便于下次使用else/如果用户选择保存并退出选项,进入该分支。(p2-next)=NULL; 令最后一个节点的next指针指向NULL; break;/跳出循环n=0-1;save(n,head);碉用save函数,将已经建立的链表存入文件main page();/返回主界面void save(int mjesson *p)

15、/save函数,将数据保存到硬盘的文件中欧静FILEp; 声明一个文件指针lesson *卩仁p;声明一个结构体指针fp=fopen(,D:data.txt,wb,);7/ 以写为目的打开 D:data.txt 路径下的二进制文件while(p-next!=NULL) /当指针p指向的节点中的next指针不为空时 (证明没有保存完毕),进入循环体 if(fwrite(p,len,1,fp)!=1) printf(*保存文件失败! n”);用 fwrite 函数 的返回值来反映是否成功保存每一个节点else prin tf(H保存文件成功! n”);P=p1- next

16、;/使结构体指针指向下一个节点;P仁P;if(p-n ext=NULL&n=-1) if(fwrite(p,len,1,fp)!=1) printf(*保存文件失败! n”);用 fwrite 函数 的返回值来反映是否成功保存每一个节点else prin tf(H保存文件成功! rT);fclose(fp);/ 尖闭文件 void serch() /查询函数(包含节点的删除与修改永博 int i,k,m,j=1; 声明一些需要用到的变量char p10; 声明一个字符型数组,用以存放用户输入的需要查询的 相尖信息struct lesson *q1 ,*q2,*head

17、=NULL; 声明读取链表所需要的三个结构 体指针file歼p;声明一个文件指针do fp=fopen(HD:data.txr;,rbH);/ 以读取为目的打开 DAdata.txt 路径 下的二进制文件if(ferror(fp) clearerr(fp);/如果打开文件错误,立即清除错误后产 生的标记,便于文件下次正常打幵if(fp=NULL)如果文件指针指向NULL (代表该文件不存在)则进 入该分支print无法打开文件! rT); exit(O); q1=q2=(struct lesson *)malloc(len); 文件打开后、在内存中幵辟空 间,存放文件读取到的数据fread(q

18、1,le n,1,fp); 读取第一个节点if(feof(fp) /用feof函数的返回值来判断该文件是否为空文件printf(”没有存储课程信息! nH);main page();q2=q1 ;两个指针同时指向第一个节点 m=0; /将m清零,便于接下来记录节点总数while(!feof(fp)/利用feof函数的返回值来判断文件是否读取完毕 m=m+1;/记录节点数if(m=1)head=q1 ;/如果为第一个节点,使head指针指向该节点q1=(struct lesson *)malloc(le n); 继续开辟下一个节点 q2 next=q1; 将新节点与上一个节点链接起来q2=q1;

19、fread(q1,le n,1,fp); 读取文件内容,存入新节点 q2-next=NULL;/文件读取完毕后,令链表的最后一个节点的next指针指向NULLq1=q2=head; 两个结构体指针重新指向头结点prin tf*n) /输出提示信息prin tf(f*输入o查看全部课程*nn);prin tf(n*输入1按课程名查询*nH);prin tf(M*输入2按课程编码查询*nn);prin tf(f*输入3按周日期查询*nH);prin tfC1*输入4按起始周查询*nn);prin tf(f*输入5返回主界面*nH);prin tf(”*nn”). doscan f(”d”,&k);

20、 if(kv0|k5) print; while(k5);switch(k)case 0:/当用户选择查看全部课程信息时,进入该分支printf(”课程编码课程名 学分学时学期周次日期 节次教室n”);for(i=1 ;iv=m;i+) /用for循环,通过已知的节点总数来控 制输出全部的课程信息output(q2); /调用输出函数q仁q2- next;/指针指向下一个结点q2=q1;q2- next=NULL;break; case 1 :当用户选择按课程名查询时,进入该分支printf(”请输入课程名!( 位字符串 例:math) n”);doscan f(”s”,&p); if(str

21、le n( q1-proj)10) print; while(strle n(q1-proj)10); / 输入要查询的课程名temp=0;/将temp归零,便于记录所查询到的节点为第几节点,便于下面 修改函数和删除函数的查找doif(!strcmp(q2-proj,p) /通过字符串比较来查找需要查 找的信息temp=temp+1; /记录节点数printf(”查询到s相尖的 课程信息为:nn;p); printf(-课程编码课程名 学分学时学期周 次日期节次 教室n”);output(q2);/调用输出函数break;/跳出循环else/如果内容与用户输入字符串不相等,查找下一个节 点j=

22、R1;q1=q2-n ext; q2=q1;while(q2- next!=NULL);if(temp=O) printf(”未查询到相尖课程! nH); 如果temp等于零,则代表没有查询到相尖信息else*printf(*nn);如果查询到相尖课程*nn);prin tf(n*输入0修改课程信息*nn);prin tf(H*输入1删除课程信息*nn);prin tf(H*输入2添加课程信息*printf(*nu);do scan f(“cT,&k); if(kv0|k2) pri nt; while(k2);if(o=1) printf(“对不起,您没有权限!请联系管理员!nn); 如果学

23、生登录,由于key函数返回值为1,就不幵放删除修改功能 else/如果是管理员登录,贝U可以使用删除,修改,添加等功能switch(k)/通过管理员的选择代码,分别调用不同 的函数case O:alter(mJ,head);break;TM用修改函数、将查 询到的课程的位置,链表的总节点数。链表的头指针传给函数case 1:head=dele(m,j,head);break;/TM 用删除函 数,将返回的指针作为下一次打开的头指针case 2:add(m,head);break;iM用添加函数,在链表 的后面继续添加break;case 2:printf(n请输入课程编码(14位字符串 例:0

24、01) rf);输入数据doscan f(”s”,&p); if(strle n( q1- num)4) print; while(strle n(q1 nu m)4); temp=0;doif(!strcmp(q2-nu m,p) temp=temp+1;printf(”查询到编码为s的课程信息为:nnH,p); printf课程编码课程名学分学时学期周次日期节次教室rT);output(q2);break;elsej=j+1; q1=q2-n ext; q2=q1;while(q2- next!=NULL); if(temp=0) printf(”未查询到相尖 课程! nH); elsep

25、rin*|n .prin tf(f*输入0修改课程信息*nH);prin tf(H*输入1删除课程信息*nn);prin tf(H*输入2添加课程信息*nH);prin tf(11 *nH)doscan f(”d”,&k); if(kv0|k2) pri nt;while(k2);if(o=1) printf(“对不起,您没有权限!请联系管理员!nn);elseswitch(k)case O:alter(m,j,head);break;case 1:head=dele(mj5head);break;case 2:add(m,head);break;break;case 3:printf(”请输

26、入周日期!(三位周日期 例:mon、sat) nn); doscan f(%s,&p); if(strle n( q1-date)3) print; while(strle n(q1-date)3);temp=0;doif(!strcmp(q2-date,p)temp=temp+1;printf(”查询到s的课程信息为:nn;p);printf(“课程编码课程名 学分学时学期周 次日期节 次教室n“);output(q2);break;elseq1=q2-n ext;q2=q1;while(q2- next!=NULL);if(temp=0) printf(味查询到相尖课程! nnH); el

27、se*先先*先printf(”prin tf(H*输入0修改课程信息*nn);*nu);prin tf(*输入1删除课程信息*nn);prin tf(n*输入2添加课程信息*nn);printf(”do*n,f);scan f(n%dn,&k);if(k2) pri nt;while(k2);if(o=1) printf(“对不起,您没有权限!请联系管理员!rT);else switch(k)case O:alter(m,j,head);break;case 1:head=dele(mj,head);break;case 2:add(m,head);break;break;case 4:pri

28、nt请输入起始周(例1-17) ! rf);doscan f(”s”,&p); if(strle n( q1week)5) print;while(strle n( q1week)5);temp=0;doif (!strcmp(q2-week,p)temp=temp+1;printf(n查询到$周的课程信息为:nrT,p);printf(“课程编码课程名 学分学时学期周 次日期节次教室F);output(q2);break;else闫+1; q1=q2-n ext; q2=q1;while(q2- next!=NULL); if(temp=O) printf(*未查询到相尖课程! nn);el

29、se* 先*:Ar*printfC*np);prin tf(*输入0修改课程信息nn);prin tf(M*输入1删除课程信息rT);prin tf(H*输入2添加课程信息nn);printfC*nu);do scan f(”d”,&k); if(kv0|k2) pri nt; while(k2);if(o=1) printfC*对不起,您没有权限!请联系管理员!rT);else switch(k)case O:alter(mJ,head);break;case 1:head=dele(mj5head);break;case 2:add(m,head);break; break;case 5:

30、ma in page();break;$M 回主界面prin tf*nprintf(-输入0终止查询并返回主界面printf(n*输入1重新查询prin tf n*p| scan f(%T,&j); system(HCLSn); while(j);if(j=O) main page(); void alter(i nt all,i nt b,lesson *head)/ 修改课程 函炳舒lesson *q1 ,*q2;int k,i,x;q1=q2=head;for(i=2;in ext;q2=q1;printfC您要修改的课程为:nn);printf(”课程编码课程

31、名学分学时学期周次日期节次教室E);output(q2);prin tf(I*输出提示信息prin tf(*输入o修改课程编码*nn);prin tf(n*输入1修改课程名*nH);prin tf(H*输入2修改学分*nn);prin tf(n*输入3修改学时*nn);prin tf(H*输入4修改学期*n);prin tf(H*输入5修改周次*nH);prin tf(H*输入6修改日期*nH);prin tf(H*输入7修改节次*nn);nH) /printf(H*输入8修改教室printf*nnn);dosea nf(”d”,&k); if(k8) pri nt; while(k8);sw

32、itch(k)case 0:printf(“您要修改的原编码为%sn;q1-num); 提示修改的内容print请输入新编码(14位字符串例:001) : n); dosea nf(%s5&q1 nu m); if(strle n( q1- num)4) print; while(strle n(q1- nu m)4); printf(*修改成功、结果为:nH); printf(”课程编码课程名学分学时学期周次日期节次 教室F); output(ql);/输出修改后本结点内所有数据save (all,head);/保存修改 break;/跳出case 1:printfC您要修改的原课程名为%s

33、nn,q1-proj);printf(”请输入新课程名(110位字符串 例:math) : nH); dosea nf(”s”,&q1proj); if(strle n( q1-proj)10) print; while(strle n(q1-proj)10);printf(“修改成功,结果为:rf);printf(”课程编码课程名学分学时学期周次日期节次 教室n”); output(ql); save(all,head); break;case 2:printfC*您要修改的原学分为%fnH,q1-crdt); printf请输入新学分:rT);dox=0;sea nf(H%sn,&q1-c

34、rdt);if(strle n(q1-crdt)4)print;elsefor(i=0;iv3;i+) if(q1-crdt)i57|(q1-crdt)icrdt)4|x=1);printf(”修改成功,结果为:rT);教室n”);printfCW程编码课程名学分学时学期周次日期节次output(ql);save(all,head);break;case 3:printf(H您要修改的原学时为%dnn,q1-hour); print请输入新学时(两位整数例:32) : rT); dox=0;sea nf(”s”,&q1hour);if(strle n(q1-hour)3)print;elsef

35、or(i=0;ihour)i57|(q1-hour)ihour)3|x=1);printf(“修改成功,结果为:rf);教室rf);printf (”课程编码课程名学分学时学期周次日期节次output(ql);save(all,head);break;caseprintfC*您要修改的原学期为%dn;q1-term); printfC*请输入新学 :期(一位整数例:2): F);dox=0;sea nf(n%sn,&q1 -term);if(strle n(q1-term)2)print;elsefor(i=0;iterm)i57|(q1 -term)iterm)2|x=1);printfC修

36、改成功,结果为:rT);教室n“);printf (“课程编码课程名学分学时学期周次日期节次output(ql);save(all,head);break;case 5:printf(n您要修改的原周次为%snH,q1-week);printf(“请输入新周次:rf);dosea nf(%sH,&q1 -week); if(strle n( q1week)5) print;while(strle n( q1week)5); printf(“修改成功,结果为:E);教室n“);printf (“课程编码课程名学分学时学期周次日期节次output(ql);save(all,head);break;

37、case 6:printfC*您要修改的原日期为%sn;q1-date); printf(”请输入新 日期:W);dosea nf(%s,&q1-date); if(strle n( q1-date)3) print;while(strle n(q1-date)3);printf(”修改成功,结果为:rf);printf (“课程编码课程名学分学时学期周次日期节次教室E);output(ql); save(all,head);case 7:break;printf(H您要修改的原节次为%snn,q1-period); printf(”请输入新节次:nH);dosea nf(”s”,&q1per

38、iod); if(strle n( q1-period)5) print; while(strle n( period)5); printf(“修改成功,结果为:rf);printfC*课程编码课程名学分学时学期周次日期节次教室E);output(ql);save(all,head);break;case 8:printf(H您要修改的原教室为%snn,q1-room); printf(“请输入新教室:nn);dosea nf(%s,&q1-room); if(strle n( q1room)6) print;while(strle n( q1room)6); printf(“修改成功,结果为

39、:rf);周次日期节次printfC*课程编码课程名学分学时学期 教室心;output(ql); save(all,head); break; printf(q 选项信息;*提示*nn);*nH);prin输入1继续查询课程printf(*输入2返回主界面printf( j*pip)* dosea nf(”d”,&k); if(k2) print;while(k2);switch(k)case 1 :serch();break;返回查询函数 case 2:ma in page();break;返 回主界面 lesson *dele(i nt allj nt b,lesson *head)/删除

40、函数欧静int i,k;lesson *q1 ,*q2,*q3;q1=q2=q3=head;for(i=2;in ext;q2=q1;printf(”您要删除的课程是:rT);if(b=1)O果要删除的结点是第一个节点,printfC*课程编码课程名学分学时学期周次日期节次教室F); output(ql);elseq3=q1- next;/如果要删除的结点不是第一个节点进入该分支printfC*课程编码课程名学分学时学期周次日期节次教室nH);output(q3);p r j ntf(*先* 先*prin 廿(”*输入0确认删除Pdn输入1取消删除*nn);*nH);

41、printf(*nu);dosea nf(n%dn,&k);if(k1) print;/ 是否确认删除 while(k1);if(!k) 如果确认删除,则进入if(b=1)head=q1- next;/如果要删除第一个节点q1-next=NULL; 令第一个节点的next指针指向NULL alkall-1;使节点总数减少一个 free(q1); 释放第一个节点所占的内存 save (al I,head);/向save函数提供新的头指针,以便保存新链表else/如果要删除的不是头结点q3=q1 next;令q3指向要删除的结点 q1=q3-next;/令q1指向要删除节点的后一个节点q2-nex

42、t=q1;/令前 一个结点的next指针指向后一个结点q3-next=NULL; 令要删除的结 点的next指针指向NULL all=all-1 ;令节点总数减少一个free(q3);/释放内存 save (all,head);/保存新链表 return(head);/返回新的头指针 void add(i nt all,lesson *head)添 加函数陈佳兴int i,z,x;less on *q1 ,*q2;q1=q2=head; for(i=2;iv=all;i+) /令q1,q2都移到最后一个节点 q1=q2-n ext;q2=q1;q仁(struct le

43、sson *)malloc(le n); 开辟新的内存空间,来存放新数据 q2- next=q1; 将新节点连接到原来的最后一个节点上q2=q1;n=0;使n归零,以便于记录新增的结点数don=n+1;/记录新增节点数 printf(-请输入课程编码(14位字符串例:001) n”); 输入数 据doscan f(”s”,&q1 nu m); if(strle n( q1 num)4) print; while(strle n(q1 nu m)4); printf(n请输入课程名(110位字符串 例:math) nn);doscan f(”s”,&q1proj); if(strle n( q1

44、proj)10) print;while(strle n(q1-proj)10);printf(”请输入学分俩位实数,整数部分1位,小数部分1位,例:1.5M);dox=0;scan f(”s”,&q1-crdt);if(strle n(q1-crdt)4)print;elsefor(i=0;iv3;i+)if (q 1 -crdt)i57| | (q 1 -crdt) icrdt)4|x=1);printfC*请输入学时俩位整数例:32)rT);doscan f(n%sn,&q1-hour);if(strle n(q1-hour)3)print;elsefor(i=0;ihour)i57|(q1-hour)ihour)3|x=1);printf(“请输入学

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论