课程设计实验报告
课程管理系统
计算机科学与工程学院
14060307班
董永博
14060307102
14060307101 14060307113 14060307121
陈佳兴 田晨光 赵炳舒
欧静
14060307126
目录
题目• ---------------------------------------- 3 分析过程与思路・ ------------------------------- 3 算法• ---------------------------------------- 5 函数模块介绍• --------------------------------- 9 源程序… -------------------------------------- 10 运行结果• • ---------------------------------- 36 课程设计总结• -------------------------------- 42
题目 课程管理系统 分析过程与思路
课程管理系统首先要能够分别实现课程信息的增加、删除、 查询、修改。为了增加程序的实用性,应当能够将输入的课程 信息通过存文件的方式将课程信息存入硬盘。而使用系统的可 能是学生和管理员两类,因此要实现根据登录类型来开放应有 的功能。
由于课程信息包含很多成员,例如课程编码、课程名等。 因此应该用链表对信息进行记录,由于不清楚课程总数,因此 需要用动态链表。动态链表的使用需要声明合适的结构体,数 据域中应包含课程所包含的各个成员、指针域用来指向下一个 结点。动态链表的建立需要用到 malloc函数。
对已经建立的链表需要存入文件,需要用到 fwrite、fread、
feof等文件处理函数,保存文件要多次用到,因此应该做一 个函
数。
删除函数要用到诸如free函数,为了防止删除的结点为首 结点,删除后找不到头结点,因此删除函数应该是一个指针函 数,用以返回删除后的新的头结点。
登录函数要返回一个值用以在其他函数中判断登录类型, 以便针对用户开放相应的功能。
f课程管理系统
^录 key
学牛登录 main page() 管理员登陆 main page() L < J J’ 查询 serch() 查询 输入 in pt() J J f 、 serch() - -'% 厂 添加 add() 修改 alter() 删除 dele() J 3 程序功能结构示意图
三.算法
开始 -----------------
-H ----------- key函数简单算法
Y
1
学生登录
管理员登录
main page() f 1 ①
四. 函数模块介绍
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 main page();〃主界面函数
int key();〃登录函数,通过返回值来判断用户类型,以 开放
不同的功能。
五. 源程序
#i nclude #defi ne len sizeof(struct less on) #define print printf(\"输入数据有误,请重新输入! \\n\"); int n,temp,o; struct less on { char num [ 5];// 课程编码 char proj[10];〃 课程名 char crdt[4];〃 学分 char hour[3];〃 学时 char term[2];〃 学期 char week[5];〃 周次 char date[5];〃周日期(周几) char period[5];〃 节次 char room[6];// 教室 struct lesson *n ext;//结构体指针 }; void in pt();〃输入函数 void serch();〃 查询函数 void alter(int all,int b,lesson *head);//修改函数 lesson *dele(i nt all,i nt b,lesson *head);//删除函数 void save(i nt n,lesson *p);〃保存函数 void output(struct lesson *q2);//输出函数 void add(i nt all,lesso n *head);//添 加 void mai npage();〃主界面函数 int key();//登录函数 int ma in ()//14060307113 田晨光 { o=key();//调用登录函数 ma in page();//调用主界面 return 0; } void mai npage()〃主界面函数 14060307101 董永博 { int m=1; while(m==1) { prin tf(\"*******************************************\\n\")・/ 输入1增加课程 prin tf(\"* 输入2查询课程 prin tf(\"* 输入3退出程序 prin tf(\"* prin tf(\"*******************************************\\n\\n\")・ do *\\n\"); *\\n\"); *\\n\"); { scan f(\"%d\ if(m<1||m>3) print;//该循环体使用户输入选项代码并判断代 码 是否合理 } while(m<1||m>3); system(\"CLS\");〃清除屏幕内容 switch(m)//通过switch语句转向用户选择的功能函数 { case 1:i npt();break;/调用输入函数 case 2:serch();break;调用查询函数 case 3:exit(0);break;/退出 } } } void in pt()// 输入函数 14060307113 田晨光 { if(o==1) { system(\"CLS\");〃 清屏 printf(\"没有权限,请联系管理员!\\n\"); main page(); } int k=1, z, x,i; struct lesson *head;/声明一个lesson类型的结构体指针,作为头指针。 struct lesson *p1,*p2;〃声明两个lesson类型的结构体指针,建造链表。 p1=p2=(struct lesson *)malloc(le n);〃使两个结构体指针都指向第一个 节点 n=0;//n用来从零开始记录当前为第几节点 while(k==1)〃循环输入 { n=n+1;//循环体每执行一次使n加1 printf(\"请输入课程编码(1-4位字符串 例:001)\\n\");//输入数据 do { scan f(\"%s\} while(strle n( p1-> nu m)>4); printf(\"请输入课程名(1-10位字符串 例:math) \\n\"); do { scan f(\"%s\ } while(strle n(p1->proj)>10); printf(\"请输入学分(两位实数,整数部分1位,小数部分1位, 例:1.5)\\n\"); do { x=0; scan f(\"%s\if(strle n(p1->crdt)>4) { print; } else { for(i=0;i<3;i++) { if((p1->crdt)[i]>57||(p1->crdt)[i]<45) { x=1; print; break; } } } } while(strle n( p1->crdt)>4||x==1); printf(\"请输入学时(两位整数例:32)\\n\"); do { x=0; scan f(\"%s\if(strle n( p1->hour)>3) { print; } else { for(i=0;i<2;i++) { if((p1->hour)[i]>57||(p1->hour)[i]<45) { x=1; print; break; } } } while(strle n(p1->hour)>3||x==1); printf(\"请输入学期(以为整数 例:2) \\n\"); do { x=0; scan f(\"%s\if(strle n( p1->term)>2) { print; } else { for(i=0;i<1;i++) { if((p1->term)[i]>57||(p1->term)[i]<45) { x=1; print; break; } } } } while(strle n( p1->term)>2||x==1); printf(\"请输入周次(例 1-17) \\n\"); do { scan f(\"%s\} while(strle n(p1->week)>5); printf(\"请输入日期(三位周日期 例:mon、sat)\\n\"); do { scan f(\"%s\} while(strle n( p1->date)>3); printf(\"请输入节次(例:5-6)\\n\"); do { scan f(\"%s\if(strle n( p1->period)>5) print; while(strle n( p1->period)>5); printf(\"请输入教室(例:2-201) \\n\"); do { scan f(\"%s\ } while(strle n( p1->room)>6); if(n==1) head=p1;〃如果n=1,(即当前为第一个节点),就使head 指 向头结点,作为头指针。 system(\"CLS\");〃输入完毕,清屏 \\ ***************************************** **\\n\");// printf(\" 输出提示信息 prin tf(\"* 输入1继续添加 *\\n\"); prin *\\n\"); 输入2保存并退出 tf(\"* \\ ***************************************** **\\n\"); printf(\" do { scan f(\"%d\ if(z<1||z>2) print;//该循环体使用户输入选项代码并判断代码 是否合理 } while(z<1||z>2); if(z==1)//如果用户选择继续添加,进入该分支 { 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 m,lesson *p)//save函数,将数据保存到硬盘的文件中 14060307126 欧静 { FILE *fp;〃声明一个文件指针 lesson *卩仁p;//声明一个结构体指针 fp=fopen(\"D:\\\\data.txt\〃 以写为目的打开 D:\\\\data.txt 路径下的 二进制文件 while(p->next!=NULL)〃当指针p指向的节点中的next指针不为空时 (证明没有保存完毕),进入循环体 { if(fwrite(p,len,1,fp)!=1) printf(\"保存文件失败! \\n\");//用 fwrite 函数 的返回值来反映是否成功保存每一个节点 else prin tf(\"保存文件成功! \\n\"); p=p1-> next;//使结构体指针指向下一个节点; P仁p; } if(p->n ext==NULL&&n==-1) { if(fwrite(p,len,1,fp)!=1) printf(\"保存文件失败! \\n\");//用 fwrite 函数 的返回值来反映是否成功保存每一个节点 else prin tf(\"保存文件成功! \\n\"); } fclose(fp);// 关闭文件 } void serch()〃查询函数(包含节点的删除与修改)14060307102董永博 { int i,k,m,j=1;〃声明一些需要用到的变量 char p[10];〃声明一个字符型数组,用以存放用户输入的需要查询的 相关信息 struct lesson *q1,*q2,*head=NULL;〃声明读取链表所需要的三个结构 体指针 FILE *fp;//声明一个文件指针 do { fp=fopen(\"D:\\\\data.txt\以读取为目的打开 D:\\\\data.txt 路径 下的二进制文件 if(ferror(fp)) clearerr(fp);//如果打开文件错误,立即清除错误后产 生的标记,便于文件下次正常打开 if(fp==NULL)//如果文件指针指向 NULL (代表该文件不存在) 则进 入该分支 printf(\"无法打开文件! \\n\"); exit(O); } q1=q2=(struct lesson *)malloc(len);〃文件打开后,在内存中开辟空 间,存放文件读取到的数据 fread(q1,le n,1,fp);〃 读取第一个节点 if(feof(fp))〃用feof函数的返回值来判断该文件是否为空文件 { printf(\"没有存储课程信息! \\n\"); 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; fread(q1,le n,1,fp);〃读取文件内容,存入新节点 } q2->next=NULL;〃文件读取完毕后,令链表的最后一个节点 的next指针指向NULL q1=q2=head;〃两个结构体指针重新指向头结点 prin tf(\"*******************************************\\n\" )・// 输出提示信息 输入0查看全部课程 prin tf(\"* 输入1按课程名查询 prin tf(\"* 输入2按课程编码查询 prin tf(\"* 输入3按周日期查询 prin tf(\"* 输入4按起始周查询 prin tf(\"* 输入5返回主界面 prin tf(\"* prin tf(\"*******************************************\\n\\n\")・ do *\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\"); { scan f(\"%d\} while(k<0||k>5); switch(k) { case 0://当用户选择查看全部课程信息时,进入该分支 printf(\"课程编码课程名 学分学时学期周次日期 节次教室 \\n\"); for(i=1;i<=m;i++)〃用for循环,通过已知的节点总数来控 制输出全部的课程信息 { output(q2);〃调用输出函数 q仁q2-> next;//指针指向下一个结点 q2=q1; } q2-> next=NULL; break; } case 1://当用户选择按课程名查询时,进入该分支 { printf(\"请输入课程名! ( 1-10位字符串 例:math) \\n\"); do { scan f(\"%s\ if(strle n( q1->proj)>10) print; } while(strle n(q1->proj)>10);〃 输入要查询的课程名 temp=0;〃将temp归零,便于记录所查询到的节点为第几 节点,便于下面修改函数和删除函数的查找 do { if(!strcmp(q2->proj,p))〃通过字符串比较来查找需要 查 找的信息 { temp=temp+1;〃记录节点数 printf(\"查询到%s相关的 课程信息为:\\n\\n\课程编码课程名 学分学时学期周 次日期节次教室\\n\"); output(q2);//调用输出函数 break;//跳出循环 } else//如果内容与用户输入字符串不相等,查找下一 个节 点 { j=j+1; q1=q2->n ext; q2=q1; } while(q2-> next!=NULL); if(temp==0) printf(\"未查询到相关课程! \\n\");〃如果temp 等于零,则代表没有查询到相关信息 else { ******************************************* *\\n\");printf(' 如果 〃 查询到相关课程 prin tf(\"* 输入 0修改课程信息 *\\n\"); prin tf(\"* 输入 1删除课程信息 输入 2添加课程信息 *\\n\"); prin tf(\"* *\\n\"); ******************************************* printf(' do { scan f(\"%d\ } while(k<0||k>2); if(o==1) printf(\"对不起,您没有权限!请联系管理员! \\n\");〃如果学生登录,由于key函数返回值为1,就不开放删除修改功能 else/如果是管理员登录,贝U可以使用删除,修改, 添加等功能 { switch(k)//通过管理员的选择代码,分别调用不 同 的函数 { case 0:alter(m,j,head);break;调用修改函数,将查 询到的课程的位置,链表的总节点数。链表的头指针传给函数 case 1:head=dele(m,j,head);break;/调 用删除函 数,将返回的指针作为下一次打开的头指针 case 2:add(m,head);break;调用添加函数,在链表 的后面继续添加 } } } break; } case 2: printf(\"请输入课程编码(1-4位字符串 例:001) \\n\");// 输入数据 do { scan f(\"%s\} while(strle n(q1- >nu m)>4); temp=0; do { if(!strcmp(q2->nu m,p)) { temp=temp+1; printf(\"查询到编码为%s的课程信息为:\\n\\n\ printf(\"课程编码课程名 学分学时学期周 次日期节次教室\\n\"); output(q2); break; } else { j=j+1; q1=q2->n ext; q2=q1; } } while(q2-> next!=NULL); if(temp==0) printf(\"未查询到相关课程! \\n\"); else { prin tf(\"*******************************************\\n\")・ 输入0修改课程信息 prin tf(\"* 输入1删除课程信息 prin tf(\"* 输入2添加课程信息 prin tf(\"* prin tf(\"*******************************************\\n\")・ do { scan f(\"%d\ *\\n\"); *\\n\"); *\\n\"); } while(k<0||k>2); if(o==1) printf(\"对不起,您没有权限!请联系管理员! \\n\"); 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; } case 3: { 次教室\\n\"); printf(\"请输入周日期!(三位周日期 例:mon、sat) \\n\"); do { scan f(\"%s\ if(strle n( q1->date)>3) print; } while(strle n(q1->date)>3); temp=0; do { if(!strcmp(q2->date,p)) { temp=temp+1; printf(\"查询到%s的课程信息为:\\n\\n\printf(\"课程编码课程名 学分学时学期周 次日期节 output(q2); break; } else { j=j+1; q1=q2->n ext; q2=q1; } } while(q2-> next!=NULL); if(temp==0) printf(\"未查询到相关课程! \\n\\n\"); else ******************************************* printf(\" prin tf(\"* 输入 0修改课程信息 输入 1删除课程信息 *\\n\"); prin tf(\"* *\\n\"); prin tf(\"* 输入 2添加课程信息 *\\n\"); ******************************************* printf(\" \\n\"); } case 4: { do { scan f(\"%d\ if(k<0||k>2) pri nt; } while(k<0||k>2); if(o==1) printf(\"对不起,您没有权限!请联系管理员! 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; printf(\"请输入起始周(例1-17)! \\n\"); do { scan f(\"%s\ if(strle n( q1->week)>5) print; } while(strle n( q1->week)>5); temp=0; do { if(!strcmp(q2->week,p)) temp=temp+1; printf(\"查询到%s周的课程信息为:\\n\\n\printf(\"课程编码课程名 学分学时学期周 次日期节 次教室\\n\"); output(q2); break; } else { j=j+1; q1=q2->n ext; q2=q1; } } while(q2-> next!=NULL); if(temp==0) printf(\"未查询到相关课程! \\n\"); else { ******************************************* printf(' prin tf(\"* *\\n\"); prin tf(\"* *\\n\"); prin tf(\"* *\\n\"); 输入 0修改课程信息 输入 1删除课程信息 输入 2添加课程信息 ******************************************* printf(' do { scan f(\"%d\ } while(k<0||k>2); if(o==1) printf(\"对不起,您没有权限!请联系管理员! \\n\"); 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; } case 5:ma in page();break;返 回主界面 } prin tf(\"*******************************************\\n\")・ printf(\"* 输入0终止查询并返回主界面 *\\n\"); printf(\"* 输入1重新查询 *\\n\"); prin tf(\"*******************************************\\n\"); scan f(\"%d\ } while(j); if(j==0) main page(); } void alter(i nt all,i nt b,lesson *head)// 修改课程 函数 14060307121 赵炳舒 { lesson *q1,*q2; int k,i,x; q1=q2=head; for(i=2;i<=b;i++)〃移动指针q1,q2到需要修改的结点 { q1=q2->n ext; q2=q1; } printf(\"您要修改的课程为:\\n\"); printf(\"课程编码 课程名学分学时学期周次 \\n\"); 日期节次 教室 output(q2); prin tf(\"*******************************************\\n\" )・// 提示信息 输出 prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* 输入0修改课程编码 输入1修改课程名 输入2修改学分 输入3修改学时 输入4修改学期 输入5修改周次 输入6修改日期 输入7修改节次 *\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\"); 输入8修改教室 printf(\"* ******************************************* *\\n\\n\"); printf(' do { sea nf(\"%d\} while(k<0||k>8); switch(k) *\\n\"); { case 0: { 容 } case 1: { printf(\"您要修改的原编码为%s\\n\〃提示修改的内 printf(\"请输入新编码(1-4位字符串 例:001): \\n\"); do { sca nf(\"%s\} while(strle n(q1-> nu m)>4); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次日期节次 教室\\n\"); output(q1);〃输出修改后本结点内所有数据 save (all,head);/保 存修改 break;//跳 出 printf(\"您要修改的原课程名为%s\\n\ printf(\"请输入新课程名(1-10位字符串 例:math): \\n\"); do { sca nf(\"%s\} while(strle n(q1->proj)>10); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次日期节次 教室\\n\"); output(q1); save(all,head); break; } case 2: { printf(\"您要修改的原学分为%f\\n\printf(\"请输入新学分:\\n\"); do { 教室\\n\"); } case 3: { x=0; sca nf(\"%s\if(strle n(q1->crdt)>4) { print; } else { for(i=0;i<3;i++) { if((q1->crdt)[i]>57||(q1->crdt)[i]<45) { x=1; print; break; } } } } while(strle n( q1->crdt)>4||x==1); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次日期节次output(q1); save(all,head); break; printf(\"您要修改的原学时为%d\\n\printf(\"请输入新学时(两位整数 例:32): \\n\"); do { x=0; sca nf(\"%s\if(strle n(q1->hour)>3) print; } else { for(i=0;i<2;i++) { if((q1->hour)[i]>57||(q1->hour)[i]<45) { x=1; print; break; } } } } while(strle n(q1->hour)>3||x==1); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次日期节次 教室\\n\"); output(q1); save(all,head); break; printf(\"您要修改的原学期为%d\\n\请输入新学} 例:2): \\n\"); case 4: 期(一位整数 do { { x=0; sca nf(\"%s\ if(strle n(q1->term)>2) { print; } else { for(i=0;i<1;i++) { if((q1->term)[i]>57||(q1->term)[i]<45) { x=1; print; break; } } } while(strle n( q1->term)>2||x==1); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次日期节次 教室\\n\"); output(q1); save(all,head); break; } case 5: { printf(\"您要修改的原周次为%s\\n\printf(\"请输入新周次:\\n\"); do { sca nf(\"%s\if(strle n( q1->week)>5) print; } while(strle n( q1->week)>5); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次日期节次 教室\\n\"); output(q1); save(all,head); break;} printf(\"您要修改的原日期为 %s\\n\请输入新case 6: 日期:\\n\"); { do { sca nf(\"%s\ if(strle n( q1->date)>3) print; } while(strle n(q1->date)>3); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次日期节次 教室\\n\"); output(q1); save(all,head); break; } case 7: { printf(\"您要修改的原节次为%s\\n\printf(\"请输入新节次:\\n\"); do { sca nf(\"%s\if(strle n( q1->period)>5) print; } while(strle n( q1->period)>5); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次 教室\\n\"); output(ql); save(all,head); break; } case 8: { printf(\"您要修改的原教室为%s\\n\printf(\"请输入新教室:\\n\"); do { sca nf(\"%s\n( q1->room)>6) print; } while(strle n( q1->room)>6); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期 教室\\n\"); output(q1); save(all,head); break; 日期 节次 周次 日期 节次 } } i*******************************************\\n\")・printf(' 选项信息 // prin tf(\"* 输入1继续查询课程 printf(\"* 输入2返回主界面 printf(' i*******************************************\\n\\n\"); do 提示 *\\n\"); *\\n\"); sea nf(\"%d\ } while(k<1||k>2); switch(k) { case 1:serch();break;返回查询函数 case 2:ma in page();break;返 回主界面 } } lesson *dele(i nt all,i nt b,lesson *head)//删除函数 14060307126 欧静 { int i,k; lesson *q1,*q2,*q3; q1=q2=q3=head; for(i=2;iq1=q2->n ext; q2=q1; } printf(\"您要删除的课程是:\\n\"); if(b==1)//如果要删除的结点是第一个节点, { printf(\"课程编码课程名学分学时学期周次日期节次教 室 \\n\"); output(q1); } else { q3=q1-> next;//如果要删除的结点不是第一个节点进入该分支 printf(\"课程编 码课程名学分学时学期周次日期节次教 室 \\n\"); output(q3); } ******************************************* printf(' prin tf(\"* 输入0确认删除 prin 输入1取消删除 tf(\"* ******************************************* printf(' *\\n\"); *\\n\"); do { sca nf(\"%d\ if(k<0||k>1) print;// 是否确认删除 } while(k<0||k>1); if(!k)〃如果确认删除,则进入 { if(b==1) { head=q1-> next;/如果要删除第一个节点 q1->next=NULL;〃令第一个节点的next指针指向NULL all=all-1;//使节 点总数减少一个 free(q1);〃释放第一个节点所占的内存 save (al l,head);/向 save函数提供新的头指针,以便保存新链 表 } else//如果要删除的不是头结点 { q3=q1->next;//令q3指向要删除的结点 q1=q3->next;//令q1指向要删除节点的后一个节点 q2->next=q1;〃令前一个结点的next指针指向后一个结点 q3->next=NULL;〃令要删除的结点的next指针指向NULL all=all-1;//令节点总数减少一个 free(q3);〃释放内存 save (all,head);/保存新链表 } } return(head);//返回新的头指针 } void add(i nt all,lesson *head)//添 加函数 14060307101 陈佳兴 { int i,z,x; lesson *q1,*q2; q1=q2=head; for(i=2;iv=all;i++)〃令q1,q2都移到最后一个节点 { q1=q2->n ext; q2=q1; } q仁(struct lesson *)malloc(le n);〃开辟新的内存空间,来存放新数据 q2-> next=q1;〃将新节点连接到原来的最后一个节点上 q2=q1; n=0;//使 n归零,以便于记录新增的结点数 do n=n+1;//记录新增节点数 printf(\"请输入课程编码(1-4位字符串 例:001) \\n\");〃输入数 据 do { scan f(\"%s\if(strle n( q1- >num)>4) print; } while(strle n(q1- >nu m)>4); printf(\"请输入课程名(1-10位字符串 例:math) \\n\"); do { scan f(\"%s\ if(strle n( q1->proj)>10) print; } while(strle n(q1->proj)>10); printf(\"请输入学分(两位实数,整数部分1位,小数部分1位, 例:1.5)\\n\"); do { x=0; scan f(\"%s\if(strle n(q1->crdt)>4) { print; } else { for(i=0;i<3;i++) { if((q1->crdt)[i]>57||(q1->crdt)[i]<45) { x=1; print; break; } } } } while(strle n( q1->crdt)>4||x==1); printf(\"请输入学时(两位整数例:32)\\n\"); do scan f(\"%s\if(strle n(q1->hour)>3) { print; } else { for(i=0;i<2;i++) { if((q1->hour)[i]>57||(q1->hour)[i]<45) { x=1; print; break; } } } } while(strle n(q1->hour)>3||x==1); printf(\"请输入学期(以为整数 例:2) \\n\"); do { x=0; scan f(\"%s\if(strle n(q1->term)>2) { print; } else { for(i=0;i<1;i++) { if((q1->term)[i]>57||(q1->term)[i]<45) { x=1; print; break; } } } } while(strle n( q1->term)>2||x==1); printf(\"请输入周次(例 1-17) \\n\"); do { scan f(\"%s\} while(strle n(q1->week)>5); printf(\"请输入日期(三位周日期 例:mon、sat) \\n\"); do { scan f(\"%s\} while(strle n(q1->date)>3); printf(\"请输入节次(例:5-6)\\n\"); do { scan f(\"%s\} while(strle n(q1->period)>5); printf(\"请输入教室(例:2-201)\\n\"); do { scan f(\"%s\if(strle n( q1->room)>6) print; } while(strle n(q1->room)>6); \\ ***************************************** **\\n\"); printf(\" 输入1继续添加 prin tf(\"* 输出提示信息 printf(\"* 输入2保存并退出 ******************************************* printf(' do { scan f(\"%d\ *\\n\");〃 *\\n\"); } while(z<1||z>2); if(z==1)〃如果选择继续添加 { q1=(struct lesson *)malloc(le n);〃开辟新空间 (q2-> next)=q1;〃指针指向新结点 q2=q1; } else//如果选择停止添加,并保存 { (q2->next)=NULL;〃令尾结点的next指针指向NULL break;//跳出 } } while(1); n=n+all;//得到新链表的节点总数 save( n,head);/传参,保存 } void output(lesson *q2)〃输出函数 14060307121 赵炳舒 { prin tf(\"%8s %6s %4s %4s %4s %4s %4s %4s %4s\\n\oj,q2->crdt,q2->hour,q2->term,q2->week,q2->date,q2->period,q2->room); } int key()//登录函数 14060307101陈佳兴 { char str1[10]={'a','d','m','i','n'},str2[10];〃 声明两个字符串,并初始化其 中一个 int a,k; ******************************************* printf(' 输入1学生登录 printf(\"* 输入2管理员登录 prin tf(\"* ****************************************** **\\n\"); printf(\" do { scan f(\"%d\〃输入选项,并记录登录类型 if(a<1||a>2) pri nt; } while(a<1||a>2); system(\"CLS\"); printf(\"请输入密码:\"); do { scan f(\"%s\⑵;〃输入密码(即另一个字符串的内容) if(strcmp(str1,str2)==0)//进行两个字符串的对比,利用函数返回 值确定两 个字符串是否相等,即密码是否正确 { printf(\"登录成功! \\n\\n\"); k=0; } else { printf(\"输入密码错误,请重新输入\"); k=1; *\\n\"); *\\n\"); } } while(k); return(a);//返回登录类型代码,即学生登录或者管理员登录 } 六. 运行结果 首界面 管理员登录界面 学生登录选择增加时界面 添加课程 输入文件保存 查看所有输入课程 选择查询方式 H H N耳 耳 耳 N 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 N n H - - 斥输入耐查看全部课程 锄入谖课程名查询 希入礙课程编码查询 喩入球周期査邕 输入4按起始,碍蓋茴 * * * * * - 朋 鲁输入课程名oath 3I 〔丄-仮位字符串例:爾曲 1 学分学时学期周次日期节次教室 Hath 2.0 24 3 1-15 5-6 3-111 •查询到呗讣相关的课程信息为: 课程编码课程名 了入2济加慄桓 输出查询结果 J果程编码课程名 GUI nath 2.0 学分学时学期周次日期节次教室 24 3 1-15 mon 5-6 3-111 血入2添剂谍檯信息 分学时学期周次日期节次教室 硕 math 2.0 0-1-2-3-4-5-6-78- A X24 3 1-15 non 5-6 3-111 入修改课黨翔码入修改遲分名・修改于,入修改周吋入修改日期入修改节次入修改教期修改次入修改室 修改课程信息 保存修改信息 删除课程信息 七. 课程设计总结 以往学习的课程知识虽然也有过一些实践机会, 但绝大多数的实 践都是一些较小的程序,仅有几十行甚至几行代码即可实现。此次大 型系统的设计和实现,让我们用到了所学过的每一点知识, 增强了对 C语言的应用能力。此外,非常重要的一点是增强了我们的团队合作 意识和课外自学能力,由于其中用到的一些知识,仅仅只接触过理论 知识而并没有经历过实践,为了能够完成该项课程设计,团队成员通 过上网或图书馆查资料去学习并掌握一些本来不是特别熟练的一些 算法和数据结构的相关知识。 在课程设计过程中,曾经出现过很多的问题。成员通过各种途径 获得知识,老师也给与了我们很大的帮助,为我们找出了很多问题也 解决了很多的问题,对此小组非常感激。其中,老师特意提起的我们 程序的模块化的严重不足,导致语句有效率低,程序冗长,不容易读 懂维护和修改。我们也深刻体会了模块化不足所造成的不便, 使我们 认识到了自己的不足,在今后的学习实践中,我们会逐渐学着去完善 自己的程序,使自己的程序更加精炼,更加易用。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务