c语言课程设计实验室值班系统实验报告.docx
- 文档编号:11670893
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:20
- 大小:897.05KB
c语言课程设计实验室值班系统实验报告.docx
《c语言课程设计实验室值班系统实验报告.docx》由会员分享,可在线阅读,更多相关《c语言课程设计实验室值班系统实验报告.docx(20页珍藏版)》请在冰点文库上搜索。
c语言课程设计实验室值班系统实验报告
一.需求分析
(1)用C语言实现系统;
(2)利用结构体数组实现值班人员等信息的数据结构设计;
(3)系统具有增加,查询,插入,排序等基本功能;
(4)系统的各个功能模块要求用函数的形式实现;
(5)将各类信息存在文件中。
二.总体设计
1.根据需求分析出所用的结构体
2.对功能进行清晰的认识,功能与功能之间有没有关联
3.对程序的整体框架够一个大概认识
4.具体实现各部分功能
5.设计与用户的交互界面,在main中实现对功能模块的调用
6.流程图如下:
三.详细设计
1.voidset_color(intcolor)
功能:
设置颜色,使得输出界面的不同信息有辨识度,是通过调用windows库函数实现的
入口参数:
颜色代号
2.inttxt_number(char*txt)
功能:
读取文件行数,便于创建链表时制循环次数,是通过读取文件中的总空格数,再除以每一行的空格数实现
入口参数:
文件名称
返回值:
文件行数
3.voidchangeTxt(worker*head)
功能:
重新把链表数据读入文件,生成新文件
入口参数:
值班人员链表
4.voidcreat(worker*head)
功能:
从文件中读取数据创建人员链表
入口参数:
值班人员链表
5.voidprintList(worker*head)
功能:
输出值班人员信息
入口参数:
值班人员链表
6.voiddelet_member(worker*head)
功能:
删除值班信息
入口参数:
值班人员链表
7.voidchange_member(worker*head)
功能:
编辑/改变值班信息
入口参数:
值班人员链表
8.worker*selectSort(worker*head)
功能:
对链表进行选择排序,因为值班人员链表带头结点,所以将头结点后面的余下链表部分单独做了一个排序,然后将该排序后链表返回,在paixv中作为值班人员链表头结点的后面的链表
入口参数:
值班人员链表
返回值:
值班人员链表
9.voidpaixv(worker*head)
功能:
排序,和selectSort(head)搭配使用
入口参数:
值班人员链表
10.voidadd(worker*head)
功能:
添加值班信息
入口参数:
值班人员链表
11.voidshow(worker*head)
功能:
显示全部请假人员
入口参数:
值班人员链表
12.intmain()
各函数调用关系:
main调用函数5,6,7,9,10,11
函数9调用函数8
函数4调用函数2
函数1,3被多个函数所调用,因为功能需要多次使用
四.程序运行结果测试与分析
1)显示实验室值班人员姓名、编号、所属实验内容、联系电话等信息;
2)查询人员
方式一:
通过编号查询
方式二:
3)值班信息编辑或修改(实验内容,请假等)
4)删除信息
删除前
删除后
5)添加工作人员
6)根据工作量排序
7)对值班人员进行登记(查看全部请假人员)
8)功能循环操作
五.结论与心得
学会了指针的使用,尽量以后把这一块搞懂
另外几个心得:
1.在用指针进行操作时,一定要注意是否为NULL,否则会运行出错,即while(p->xxx){},没有while(p&&p->xxx){}安全。
2.链表的最后一个节点一定要将next置为NULL,否则会造成各种问题,出现死循环等等
3.注意带头结点和不带头结点的链表的区别
4.注意:
数组下标一定不要越界
5.设计交互界面时候,尽量美观,使得操作简易
通过C语言课设的制作,我对C语言的兴趣更加浓厚,这是不小的收获!
附录
#include
#include
#include
#include
typedefstructworker{
charname[9];//姓名
charnumber[5];//编号
chartelephone[12];//电话
charlab[30];//实验内容
intflag;//是否请假,1表示请假
intworkload;//工作量
structworker*next;
}worker;
voidset_color(intcolor){//设置颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
}
inttxt_number(char*txt){//读取不同菜单文件行数,便于创建菜单控制循环次数
FILE*fp;
intnum=0;
charc;
fp=fopen(txt,"r");
if(fp){
while((c=fgetc(fp))!
=EOF)
{
if(c=='')
num++;
}
}
fclose(fp);
return(num/5);//除2是因为每行有5个空格
}
voidchangeTxt(worker*head){//重新把链表数据读入文件,生成新文件
FILE*ft=fopen("temp.txt","w");
worker*p=head->next;
while(p){
fprintf(ft,"%s%s%s%s%d%d\n",p->name,p->number,p->telephone,p->lab,p->flag,p->workload);
p=p->next;
}
fclose(ft);
remove("值班信息.txt");
rename("temp.txt","值班信息.txt");
}
voidcreat(worker*head){//从文件中读取数据创建人员链表
if(head==NULL)
printf("创建失败!
");
else{
FILE*fp=fopen("值班信息.txt","r");
intnum=txt_number("值班信息.txt");
if(fp){
worker*tail=head;
for(inti=0;i worker*node=(worker*)malloc(sizeof(worker)); fscanf(fp,"%s%s%s%s%d%d",node->name,node->number,node->telephone,node->lab,&node->flag,&node->workload); tail->next=node; tail=node; } tail->next=NULL; fclose(fp); } else printf("错误文件打不开! "); } } voidprintList(worker*head){//输出值班人员信息 worker*p=head->next; printf("\n\t---------------------------------------------------------------------------------"); printf("\n\t|序号|\t|姓名|\t|编号|\t|电话|\t|实验内容|\t|请假|\t|工作量|\t\n"); printf("\t---------------------------------------------------------------------------------\n"); inti=1; while(p){ printf("\t|%d\t%s\t%s\t%s\t%s\t%d\t%d\t|\n",i++,p->name,p->number,p->telephone,p->lab,p->flag,p->workload); printf("\t---------------------------------------------------------------------------------\n"); p=p->next; } } voiddelet_member(worker*head){//删除值班信息 printf("\n请问您想按以下哪种删除? \n\n\t1.编号删除\n\t2.姓名删除\n\n请输入您的选择: "); intkey; set_color(0xc);scanf("%d",&key);set_color(0x7); if(key==2){ printf("请输入您需要删除人员的姓名: "); charpeople[9]; set_color(0xc);scanf("%s",people);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("\n\n\t\t\t\t删除失败! 未找到该人员的信息。 \n"); else{ pre->next=p->next; free(p); printf("\n\n\t\t\t\t删除成功! 人员详细信息如下: \n\n"); printList(head); changeTxt(head); } } elseif(key==1){ printf("请输入您需要删除人员的编号: "); charnumber[9]; set_color(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("\n\n\t\t\t\t删除失败! 未找到该人员的信息。 \n"); else{ pre->next=p->next; free(p); printf("\n\n\t\t\t\t删除成功! 人员详细信息如下: \n\n"); printList(head); changeTxt(head); } } else{ printf("\n\n\t\t\t-----提示: 您的输入有误! \n\n"); } } voidchange_member(worker*head){//编辑值班信息 printf("\n请问您想按以下哪种方式查找到该人员? \n\n\t1.编号\n\t2.姓名\n\n请输入您的选择: "); intkey; set_color(0xc);scanf("%d",&key);set_color(0x7); if(key==2){ printf("请输入人员的姓名: "); charpeople[9]; set_color(0xc);scanf("%s",people);set_color(0x7); worker*p=head->next; while(p&&strcmp(people,p->name)) p=p->next; if(p==NULL) printf("\n\n\t\t\t\t修改失败! 未找到该人员的信息。 \n"); else{ printf("\n\n\t\t\t\t查找成功! 人员详细信息如下: \n\n"); printf("\t-------------------------------------------------------------------------"); printf("\n\t|姓名|\t|编号|\t|电话|\t|实验内容|\t\t|请假|\t|工作量|\t\n"); printf("\t-------------------------------------------------------------------------\n"); printf("\t|%s\t%s\t%s\t%s\t%d\t%d\t|\n",p->name,p->number,p->telephone,p->lab,p->flag,p->workload); printf("\t-------------------------------------------------------------------------\n\n"); printf("请重新输入该人员的全部信息,空格分开: \n\n"); 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("\n\n\t\t\t\t修改成功! 人员详细信息如下: \n\n"); printList(head); changeTxt(head); } } elseif(key==1){ printf("请输入人员的编号: "); charnumber[9]; set_color(0xc);scanf("%s",number);set_color(0x7); worker*p=head->next; while(p&&strcmp(number,p->number)){ p=p->next; } if(p==NULL) printf("\n\n\t\t\t\t删除失败! 未找到该人员的信息。 \n"); else{ printf("\n\n\t\t\t\t查找成功! 人员详细信息如下: \n\n"); printf("\t-------------------------------------------------------------------------"); printf("\n\t|姓名|\t|编号|\t|电话|\t|实验内容|\t\t|请假|\t|工作量|\t\n"); printf("\t-------------------------------------------------------------------------\n"); printf("\t|%s\t%s\t%s\t%s\t%d\t%d\t|\n",p->name,p->number,p->telephone,p->lab,p->flag,p->workload); printf("\t-------------------------------------------------------------------------\n\n"); printf("请重新输入该人员的全部信息,空格分开: \n\n"); 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("\n\n\t\t\t\t修改成功! 人员详细信息如下: \n\n"); printList(head); changeTxt(head); } } else{ printf("\n\n\t\t\t-----提示: 您的输入有误! \n\n"); } } worker*selectSort(worker*head){//链表选择排序 worker*p=head; worker*q=head; worker*pre,*max,*max_pre,*p_pre; worker*temp; pre=q; while(q){ p=q; max=q; p_pre=pre; while(p){ if(max->workload>p->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)//是否为第一个节点 pre->next=max; else head=max; } pre=max; q=max->next; } returnhead; } voidpaixv(worker*head){//根据编号排序 head->next=selectSort(head->next); printf("\n\n\t\t\t\t排序成功! 人员详细信息如下: \n\n"); printList(head);//changeTxt(head); } voidadd(worker*head){//添加值班信息 worker*p=(worker*)malloc(sizeof(worker)); printf("请按提示输入新加入人员的全部信息,空格分开: \n\n"); printf("名字编号电话实验名称是否请假工作量\n\n"); 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("\n\n\t\t\t\t修改成功! 人员详细信息如下: \n\n"); printList(head); changeTxt(head); } voidshow(worker*head){//显示全部请假人员 worker*p=head->next; printf("\n\n今日全部请假人员如下: \n"); printf("\n\t|序号|\t|姓名|\t|编号|\t|电话|\t|实验内容|\t|\n"); printf("\t-----------------------------------------------------------------\n"); inti=1; while(p){ if(p->flag){ printf("\t|%d\t%s\t%s\t%s\t%s\t|\n",i++,p->name,p->number,p->telephone,p->lab); printf("\t-----------------------------------------------------------------\n"); } p=p->next; } } intmain(){ intkey; worker*head=(worker*)malloc(sizeof(worker)); head->next=NULL; printf("\n\t******************************欢迎进入值班信息系统********************************\n\n"); printf("\n\t----------------------------------全部值班信息------------------------------------\n"); creat(head); printList(head); set_color(0x2); printf("\n请问您想进行何种操作: \n\n"); set_color(0x7); printf("\t1.值班信息编辑(请假)\n\t2.删除人员\n\t3.添加人员\n\t4.根据工作量排序\n\t5.查看全部请假人员\n\t6.退出系统"); printf("\n\n请输入您的选择: "); set_color(0xc);scanf("%d",&key);set_color(0x7); while(key! =6){ switch(key){ case1: change_member(head); break; case2: delet_member(head); break; case3: add(head); break; case4: paixv(head); break; case5: show(head); break; } set_color(0x2); printf("\n请问您想进行何种操作: \n\n"); set_color(0x7); printf("\t1.值班信息编辑(请假)\n\t2.删除人员\n\t3.添加人员\n\t4.根据工作量排序\n\t5.查看全部请假人员\n\t6.退出系统"); printf("\n\n请输入您的选择: "); set_color(0xc);scanf("%d",&key);set_color(0x7); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 实验室 值班 系统 实验 报告