1、c语言课程设计实验室值班系统实验报告一需求分析(1)用C语言实现系统;(2)利用结构体数组实现值班人员等信息的数据结构设计;(3)系统具有增加,查询,插入,排序等基本功能;(4)系统的各个功能模块要求用函数的形式实现;(5)将各类信息存在文件中。二总体设计1.根据需求分析出所用的结构体2.对功能进行清晰的认识,功能与功能之间有没有关联3.对程序的整体框架够一个大概认识4.具体实现各部分功能5.设计与用户的交互界面,在main中实现对功能模块的调用6.流程图如下:三详细设计1.void set_color(int color)功能:设置颜色,使得输出界面的不同信息有辨识度,是通过调用window
2、s库函数实现的入口参数:颜色代号2.int txt_number(char *txt)功能:读取文件行数,便于创建链表时制循环次数,是通过读取文件中的总空格数,再除以每一行的空格数实现入口参数:文件名称返回值:文件行数3.void changeTxt(worker*head)功能:重新把链表数据读入文件,生成新文件入口参数:值班人员链表4.void creat(worker*head)功能:从文件中读取数据创建人员链表入口参数:值班人员链表5.void printList(worker*head)功能:输出值班人员信息入口参数:值班人员链表6.void delet_member(worker*
3、head)功能:删除值班信息入口参数:值班人员链表7.void change_member(worker*head)功能:编辑/改变值班信息入口参数:值班人员链表8.worker* selectSort(worker *head)功能:对链表进行选择排序,因为值班人员链表带头结点,所以将头结点后面的余下链表部分单独做了一个排序,然后将该排序后链表返回,在paixv中作为值班人员链表头结点的后面的链表入口参数:值班人员链表返回值:值班人员链表9.void paixv(worker*head)功能:排序,和selectSort(head) 搭配使用入口参数:值班人员链表10.void add(wo
4、rker*head)功能:添加值班信息入口参数:值班人员链表11.void show(worker*head)功能:显示全部请假人员入口参数:值班人员链表12.int main()各函数调用关系:main调用函数 5,6,7,9,10,11函数9调用函数8函数4调用函数2函数1,3被多个函数所调用,因为功能需要多次使用四程序运行结果测试与分析1)显示实验室值班人员姓名、编号、所属实验内容、联系电话等信息;2)查询人员方式一:通过编号查询方式二:3)值班信息编辑或修改(实验内容,请假等)4)删除信息删除前删除后5)添加工作人员6)根据工作量排序7)对值班人员进行登记(查看全部请假人员)8)功能循
5、环操作五结论与心得学会了指针的使用,尽量以后把这一块搞懂另外几个心得:1.在用指针进行操作时,一定要注意是否为NULL,否则会运行出错,即while(p-xxx), 没有while(p&p-xxx) 安全。2.链表的最后一个节点一定要将next置为NULL,否则会造成各种问题,出现死循环等等3.注意带头结点和不带头结点的链表的区别4.注意:数组下标一定不要越界5.设计交互界面时候,尽量美观,使得操作简易通过C语言课设的制作,我对C语言的兴趣更加浓厚,这是不小的收获!附录#include #include #include #include typedef struct worker char
6、name9;/ 姓名 char number5; / 编号 char telephone12; / 电话 char lab30; / 实验内容 int flag; / 是否请假,1表示请假 int workload; / 工作量 struct worker*next;worker;void set_color(int color) / 设置颜色 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);int txt_number(char *txt) /读取不同菜单文件行数,便于创建菜单控制循环次数 FILE *fp; i
7、nt num=0; char c; fp = fopen(txt,r); if(fp) while(c = fgetc(fp)!= EOF) if(c= ) num+; fclose(fp); return (num/5); / 除2是因为每行有5个空格void changeTxt(worker*head) / 重新把链表数据读入文件,生成新文件 FILE *ft = fopen(temp.txt,w); worker* p=head-next; while(p) fprintf(ft,%s %s %s %s %d %dn,p-name,p-number,p-telephone,p-lab,p
8、-flag,p-workload); p=p-next; fclose(ft); remove(值班信息.txt); rename(temp.txt,值班信息.txt);void creat(worker*head) / 从文件中读取数据创建人员链表 if(head=NULL) printf(创建失败!); else FILE*fp=fopen(值班信息.txt,r); int num=txt_number(值班信息.txt); if(fp) worker*tail=head; for(int i=0;iname,node-number,node-telephone,node-lab,&nod
9、e-flag,&node-workload); tail-next=node; tail=node; tail-next=NULL; fclose(fp); else printf(错误文件打不开!); void printList(worker*head) / 输出值班人员信息 worker*p=head-next; printf(nt-); printf(nt|序号|t|姓名|t|编号|t |电话|t |实验内容|t |请假|t |工作量|tn); printf(t-n); int i=1; while(p) printf(t|%dt%st%st %st%st%dt %dt|n,i+,p-
10、name,p-number,p-telephone,p-lab,p-flag,p-workload); printf(t-n); p=p-next; void delet_member(worker*head) / 删除值班信息 printf(n请问您想按以下哪种删除?nnt1.编号删除nt2.姓名删除nn请输入您的选择: ); int key; set_color(0xc);scanf(%d,&key); set_color(0x7); if(key=2) printf(请输入您需要删除人员的姓名:); char people9; set_color(0xc);scanf(%s,people
11、);set_color(0x7); worker*p=head-next; worker*pre=head; while(p&strcmp(people,p-name) pre=p; p=p-next; if(p=NULL) printf(nntttt删除失败!未找到该人员的信息。n); else pre-next=p-next; free(p); printf(nntttt删除成功!人员详细信息如下:nn); printList(head); changeTxt(head); else if(key=1) printf(请输入您需要删除人员的编号:); char number9; set_c
12、olor(0xc);scanf(%s,number);set_color(0x7); worker*p=head-next; worker*pre=head; while(p&strcmp(number,p-number) pre=p; p=p-next; if(p=NULL) printf(nntttt删除失败!未找到该人员的信息。n); else pre-next=p-next; free(p); printf(nntttt删除成功!人员详细信息如下:nn); printList(head); changeTxt(head); else printf(nnttt-提示:您的输入有误!nn)
13、; void change_member(worker*head) / 编辑值班信息 printf(n请问您想按以下哪种方式查找到该人员?nnt1.编号nt2.姓名nn请输入您的选择: ); int key; set_color(0xc);scanf(%d,&key); set_color(0x7); if(key=2) printf(请输入人员的姓名:); char people9; set_color(0xc);scanf(%s,people);set_color(0x7); worker*p=head-next; while(p&strcmp(people,p-name) p=p-nex
14、t; if(p=NULL) printf(nntttt修改失败!未找到该人员的信息。n); else printf(nntttt查找成功!人员详细信息如下:nn); printf(t-); printf(nt|姓名|t|编号|t |电话|t |实验内容|tt|请假|t|工作量|tn); printf(t-n); printf(t|%st%st %st%st %dt %dt|n,p-name,p-number,p-telephone,p-lab,p-flag,p-workload); printf(t-nn); printf(请重新输入该人员的全部信息,空格分开:nn); set_color(0
15、xc);scanf(%s%s%s%s%d%d,p-name,p-number,p-telephone,p-lab,&p-flag,&p-workload); set_color(0x7); printf(nntttt修改成功!人员详细信息如下:nn); printList(head); changeTxt(head); else if(key=1) printf(请输入人员的编号:); char number9; set_color(0xc);scanf(%s,number);set_color(0x7); worker*p=head-next; while(p&strcmp(number,p
16、-number) p=p-next; if(p=NULL) printf(nntttt删除失败!未找到该人员的信息。n); else printf(nntttt查找成功!人员详细信息如下:nn); printf(t-); printf(nt|姓名|t|编号|t |电话|t |实验内容|tt|请假|t|工作量|tn); printf(t-n); printf(t|%st%st %st%st %dt %dt|n,p-name,p-number,p-telephone,p-lab,p-flag,p-workload); printf(t-nn); printf(请重新输入该人员的全部信息,空格分开:
17、nn); set_color(0xc);scanf(%s%s%s%s%d%d,p-name,p-number,p-telephone,p-lab,&p-flag,&p-workload); set_color(0x7);printf(nntttt修改成功!人员详细信息如下:nn); printList(head); changeTxt(head); else printf(nnttt-提示:您的输入有误!nn); worker* selectSort(worker *head) / 链表选择排序 worker*p=head; worker*q=head; worker*pre,*max,*ma
18、x_pre,*p_pre; worker*temp; pre=q; while(q) p=q; max=q; p_pre=pre; while(p) if(max-workloadp-workload) max_pre=p_pre; max=p; p_pre=p; p=p-next; if(q!=max) if(q-next=max) / 要交换的两节点是否相邻 q-next=max-next; max-next=q; else temp=q-next; q-next=max-next; max_pre-next=q; max-next=temp; if(q!=head ) /是否为第一个节点
19、 pre-next=max; else head=max; pre=max; q=max-next; return head;void paixv(worker*head) / 根据编号排序 head-next=selectSort(head-next); printf(nntttt排序成功!人员详细信息如下:nn); printList(head);/changeTxt(head);void add(worker*head) / 添加值班信息 worker*p=(worker*)malloc(sizeof(worker); printf(请按提示输入新加入人员的全部信息,空格分开:nn);
20、printf(名字 编号 电话 实验名称 是否请假 工作量 nn); set_color(0xc);scanf(%s%s%s%s%d%d,p-name,p-number,p-telephone,p-lab,&p-flag,&p-workload); set_color(0x7);worker*q=head-next; while(q-next) q=q-next; q-next=p; p-next=NULL; printf(nntttt修改成功!人员详细信息如下:nn); printList(head); changeTxt(head);void show(worker*head) / 显示全
21、部请假人员 worker*p=head-next; printf(nn今日全部请假人员如下:n); printf(nt|序号|t|姓名|t|编号|t |电话|t |实验内容|t |n); printf(t-n); int i=1; while(p) if(p-flag) printf(t|%dt%st%st %st%st|n,i+,p-name,p-number,p-telephone,p-lab); printf(t-n); p=p-next; int main() int key; worker*head=(worker*)malloc(sizeof(worker); head-next=
22、NULL; printf(nt*欢迎进入值班信息系统*nn); printf(nt-全部值班信息-n); creat(head); printList(head); set_color(0x2); printf(n请问您想进行何种操作:nn); set_color(0x7); printf(t1.值班信息编辑(请假)nt2.删除人员nt3.添加人员nt4.根据工作量排序nt5.查看全部请假人员nt6.退出系统); printf(nn请输入您的选择: ); set_color(0xc);scanf(%d,&key); set_color(0x7); while(key!=6) switch(ke
23、y) case 1: change_member(head); break; case 2: delet_member(head); break; case 3: add(head); break; case 4: paixv(head); break; case 5: show(head); break; set_color(0x2); printf(n请问您想进行何种操作:nn); set_color(0x7); printf(t1.值班信息编辑(请假)nt2.删除人员nt3.添加人员nt4.根据工作量排序nt5.查看全部请假人员nt6.退出系统); printf(nn请输入您的选择: ); set_color(0xc);scanf(%d,&key); set_color(0x7); return 0;