c语言职工信息管理系统设计共24页Word下载.docx
《c语言职工信息管理系统设计共24页Word下载.docx》由会员分享,可在线阅读,更多相关《c语言职工信息管理系统设计共24页Word下载.docx(28页珍藏版)》请在冰豆网上搜索。
![c语言职工信息管理系统设计共24页Word下载.docx](https://file1.bdocx.com/fileroot1/2023-2/3/05d248da-10e6-4d3d-96f0-fb27c7fdca38/05d248da-10e6-4d3d-96f0-fb27c7fdca381.gif)
5、职工信息删除、修改功能
2.题目分析
该职工信息管理系统包括以下几个功能:
①信息录入
②信息浏览
③信息查询
④信息修改
⑤信息删除
据此,该系统应至少构建以下函数:
①信息录入函数
②信息输出函数
③信息查找函数
④信息更改函数
⑤信息删除函数
五大功能对应五大函数,便于编写出规划的模块化程序。
此外,题目要求以菜单方式工作、职工信息用文件保存,同时程序应满足美观以及使用简单方便的要求,构建下列函数:
⑥菜单函数(包括几个子菜单函数)
⑦信息储存函数
⑧信息读取函数
⑨系统终止函数
需要成功编写上述函数,主要需要突破以下难点:
①利用结构体类型保存职工信息
②将职工信息保存在文件中
③将职工信息从文件中读取出来
④信息成功录入(每次录入都是新增)
⑤结构体变量成员的引用
⑥strcmp函数的使用(成功搜索所需信息,用于查找、更改、删除等功能)
⑦数组信息的删除
⑧菜单循环功能
⑨系统界面、文字、注释优化,信息对齐输出
二、总体设计
1.基本思路:
如流程图(简略)所示:
系统基本思路为:
将不同功能模块化,分别调用相应函数进行设计,使程序代码清晰易读,设计思路清晰明了。
系统分为5大功能:
录入、浏览、查询、删除、更改功能。
1录入功能:
调用录入函数,信息储存、读取函数:
利用for循环,对信息进行录入(新增),并保存到文件中;
2浏览功能:
调用浏览函数:
利用for循环,简单地对已有职工信息进行打印,并做到输出界面美观,可读性强的效果;
3查询功能:
调用查询函数、信息读取函数:
拥有两种功能1.按职工号查询信息2.按姓名查询信息;
4删除功能:
调用删除函数,信息储存、读取函数:
将文件中的信息读取出并删除,之后保存新信息
5更改功能:
调用更改函数,信息储存、读取函数:
具有两种功能1.整体修改信息2.局部修改信息
三、详细设计
(一)信息储存函数:
1.voidsave(intm)
2.inti;
3.FILE*fp;
4.if((fp=fopen("
职工名单.txt"
"
wb"
))==NULL)
5.printf("
文件打开错误\n"
);
6.exit(0);
7.for(i=0;
i<
m;
i++)
8.if(fwrite(&
member[i],sizeof(structinf),1,fp)!
=1)
9.printf("
文件写入错误\n"
10.fclose(fp);
函数功能:
将信息存储到文件中
(二)信息读取函数:
1.intload()
2.FILE*fp;
3.inti=0;
rb"
文件打开失败\n"
7.else
8.do
9.fread(&
member[i],sizeof(structinf),1,fp);
10.i++;
11.while(feof(fp)==0);
12.fclose(fp);
13.return(i-1);
将储存在文件中的信息读入程序中,返回已有信息量的值
(三)信息展示函数:
1.voidshow()
2.intt;
3.inti=load();
4.printf("
工号\t\t\t姓名\t\t\t性别\t\t\t年龄\n\n"
5.for(t=0;
t<
i;
t++)
6.printf("
%-12s\t\t%-12s\t\t%-12s\t\t%-12d\n\n"
member[t].no,member[t].name,member[t].sex,member[t].age);
7.printf("
工资\t\t\t学历\t\t\t地址\t\t\t手机号码\n\n"
8.for(t=0;
%-12ld\t\t%-12s\t\t%-12s\t\t%-12s\n\n"
member[t].wages,member[t].edu,member[t].addr,member[t].telno);
函数功能:
简单地将存储在文件中的信息打印在屏幕上
(四)信息查找函数:
1.voidfunc3()
2.intt,a,cmd3;
4.charno[11];
5.charedu[20];
6.Menu3();
7.fflush(stdin);
8.scanf("
%d"
&
cmd1);
9.show();
10.switch(cmd1)
11.case(0):
main();
12.case
(1):
13.printf("
请输入您想要查找的职工号:
\n"
14.fflush(stdin);
15.scanf("
%s"
no);
16.for(t=0;
17.{if(strcmp(member[t].no,no)==0)
18.printf("
恭喜你查找到结果:
\n\n"
19.printf("
20.printf("
21.printf("
22.printf("
23.else{
24.printf("
对不起,您的输入有误。
\n\n请您选择接下来的操作:
\n1.重新输出\t2.返回上一级菜单\t3.终止程序\n"
25.fflush(stdin);
26.scanf("
cmd3);
27.switch(cmd3)
28.case
(1):
func3();
29.case
(2):
Menu();
30.case(3):
printf("
感谢您使用本系统,您如有对本团队的不满或建议,请致电123456789,谢谢!
31.exit(0);
32.}break;
33.case
(2):
34.printf("
请输入您想要要查找的学历:
35.fflush(stdin);
36.scanf("
edu);
37.for(a=0;
a<
a++)
38.{if(strcmp(member[a].edu,edu)==0)
39.printf("
40.printf("
41.printf("
member[a].no,member[a].name,member[a].sex,member[a].age);
42.printf("
43.printf("
member[a].wages,member[a].edu,member[a].addr,member[a].telno);
44.else{
45.printf("
\n1.重新输入\t2.返回上一级菜单\t3.终止程序\n"
46.fflush(stdin);
47.scanf("
48.switch(cmd3)
49.case
(1):
50.case
(2):
51.case(3):
52.exit(0);
53.}break;
54.}End();
函数名字说明:
函数为菜单3(信息查询)所需功能,故为func3
函数功能说明:
1.输入职工号查找信息2.输入姓名查找信息
(五)信息删除函数
1.voiddel()
2.intm=load();
3.inti,j,n,t,judge;
4.charname[18];
以下为系统中已存在的职工信息:
6.show();
8.printf("
请输入您想要删除的职工的姓名:
9.fflush(stdin);
10.scanf("
name);
11.for(judge=1,i=0;
judge&
&
12.if(strcmp(member[i].name,name)==0)
恭喜您找到此人,ta的信息如下:
14.printf("
15.printf("
member[i].no,member[i].name,member[i].sex,member[i].age);
16.printf("
17.printf("
member[i].wages,member[i].edu,member[i].addr,member[i].telno);
您确定要删除此人信息吗?
\n1.确定\t2.不删除\n"
19.fflush(stdin);
20.scanf("
n);
21.if(n==1)
22.for(j=i;
j<
m-1;
j++)
23.strcpy(member[j].no,member[j+1].no);
24.strcpy(member[j].name,member[j+1].name);
25.strcpy(member[j].sex,member[j+1].sex);
26.member[j].age=member[j+1].age;
27.member[j].wages=member[j+1].wages;
28.strcpy(member[j].edu,member[j+1].edu);
29.strcpy(member[j].addr,member[j+1].addr);
30.strcpy(member[j].telno,member[j+1].telno);
31.judge=0;
32.else
33.printf("
请选择您接下来想要做的:
\n1.返回主菜单\t2.重新执行删除功能\n"
34.fflush(stdin);
35.scanf("
cmd2);
36.if(cmd2==1)
37.main();
38.else
39.del();
40.if(!
judge!
=0)
41.m=m-1;
42.else
对不起,查无此人\n\n"
44.printf("
\n1.返回主菜单\t2.重新输入\n"
45.fflush(stdin);
46.scanf("
47.if(cmd2==1)
48.main();
49.else
50.del();
51.printf("
下面为删除信息后所有职工信息:
52.save(m);
53.show();
54.printf("
请问您要继续删除吗?
\n1.是\t2.不需要\n"
55.fflush(stdin);
56.scanf("
t);
57.switch(t)
58.case
(1):
del();
break;
59.case
(2):
四、程序运行结果测试与分析
1.主菜单界面:
菜单简洁明了,不失美观,为方便用户使用,提供手动清屏功能(9)
2.信息浏览功能:
该功能可实现从文件中读取信息并打印到屏幕上,信息对称具有一定可读性。
(并不是每次运行程序都需要录入信息再浏览,可以直接浏览以前运行程序时曾经录入的信息)
3.信息录入功能:
此处为信息录入功能菜单界面,简洁清新。
此处为录入功能工作界面,按照提示输入相应数据即可成功录入
此处为录入成功后,录入结束界面(每一个功能结束界面均为这个)
4.信息查询功能
此处为信息查询功能,按照题目要求分两种查询功能:
1.职工号查询;
2.学历查询。
两种功能的实现方式均为从文件中读取信息再与输入信息对比,一致即将信息输出到屏幕。
最后调用END函数,选择后续操作。
5.信息删除功能
如上图,每次执行删除功能前,都会将信息从文件中读取出来并输出到屏幕,以便于用户选择所需删除的信息。
如上图,输入想要删除的职工信息之后,成功搜索后输出此人信息并询问用户是否需要删除此人信息:
确定后执行删除功能。
如上图,删除功能执行后,将信息删除后的信息输出屏幕,此后询问用户是否需要继续删除,需要即重复删除功能操作,不需要则调用END函数选择后续操作。
6.信息修改功能
如上图,与删除功能一致,执行功能前将所有信息输出屏幕,以便用户选择其所需更改的职工信息
如上图,找到此人信息后,询问是否确定修改:
否,则选择重新修改或是返回主菜单;
确定修改则再次进行功能选择:
1.整体修改2.单个修改
如上图,此处为整体修改功能界面,只需按照文字提示即可顺利操作
如上图,此处为单个修改界面,每次修改只能修改一个选项。
如上图,此处为单个修改修改后效果,只将工号改变
7.退出界面
最后表达感谢以及留下联系方式。
注:
由于电脑问题,程序不能全屏显示,因此上述截图中的电话号码没有空间输出,自动换行到第二行。
正常情况下是不会出现的。
五、结论与心得
1.变量定义、命名:
最初进行设计时,出错最多的地方是每一个函数变量的定义,因为函数较多,而我也从未进行过这样的程序设计,导致局部变量,全局变量方面有些许混乱,再加上对变量的命名,将我弄得焦头烂额。
解决方法:
在将程序大体上编写好后,重新仔细阅读了课本在这方面的知识,对变量进行了一定程度上的规范,解决了这上面的问题。
2.文件的建立、存储、读取:
在拿到课设题目的时候,便发现基本上大多数题目都需要将信息储存到文件中,当初我的内心是崩溃的,因为并没有学习过这方面的内容,据说文件还是C语言的精髓之一。
只好乖乖地拿起书本,将这方面的内容浏览一遍。
一遍遍地试,虽然对文件还是一知半懂,但也终于可以实现文件的建立,存储、读取功能了。
3.信息录入功能
这一点也许并不算是难点,但在程序运行初期,这个功能每次录入的时候会将之前录入的信息覆盖掉,而不是更新。
考虑到程序的实用性,显然这样的功能是不符合要求的,于是对其进行了更改,还是改了一下控制条件,便实现了我想要的功能:
每次录入都是新增,而不是覆盖。
我称之为神奇的条件。
4.数据体结构定义
刚开始的定义,对职工编号、电话号码等数据定义的是长整型,后来却发现因为职工编号(测试时我输入的是学号,有10位)、电话号码过长,已超出长整型数据的范围。
这里给予我警醒:
在以前的C语言学习过程中,我总是忽略了这些数据范围大小,认为记这些并没有什么用,在课设时才意识到,这一点也是不可忽略的!
随后我便将这些数据定义为字符串数组,顺利解决了这个问题。
5.信息忘记修改
比如说,在第三点更改数据类型后,将后面的一些相应点修改后,却依然有漏改的:
如信息查询时,整型与字符串的比较方式不一样,此处漏改将会导致程序出错。
至今未能有较好的改正方法,只能更加细心,或修改前将所需要修改的点罗列出来。
6.对条件的控制
在这样一个比较大(在我这样的初学者看来)的程序中,对某些条件的控制出错可谓是致命的,因为编译并不会出错,而程序运行结果却会偏离预想轨道,发现错误难度大大提高。
我便是在职工信息查询功能—职工姓名查询中,久久发现不了错误,就是一直查找不成功,后来经过多次检查才发现是条件控制少了个“等于号”。
解决方案,只能是在进行条件控制时加倍留心,力争不出错。
7.画面界面设置
作为一个应用程序,界面必须好看具有较强可读性,否则实用性不强。
在做清屏功能时,也有想过每做一步自动清屏,但根据用户需要,有时候需要查阅前面的操作,因此,最终选择的是手动清屏功能,适合不同的需求。
此外,在进行信息输出到屏幕时,往往会因为长度不够,出现不对齐的现象,这个问题困扰我比较久,最后通过长度规定,一个一个尝试,试出比较适合的一个长度,实现了对齐输出。
8.程序模块化设计
此处课程设计,最大的收获可能便是模块化设计,将程序分为一块一块的函数,便于浏览,思路清晰,简洁明了,修改方便,也可以减少程序代码行数,降低了程序的复杂度,使程序设计、调试和维护等操作简单化
9.未完成的想法
①界面还可以更加优美,同学中还有能改变背景色的,我也希望可以这样做。
②程序中有很多重复的地方(可直接用函数调用),比如说在删除、修改功能中的删除修改前的信息展示,可直接调用信息显示函数;
但在查询功能中,由于在一些文字解释上面的需要或者是功能特别要求,不能直接套用,需要做一些修改。
这是我觉得比较不好的地方,想要改,但其他课程的压力实在有些大,找不出时间好好想想怎么修改。
③用链表储存信息。
现在的这个程序采用的是数组储存信息,在删除、修改功能上并没有链表方便,但想要采用链表时,程序已经写完了一半,如果重新采用链表,就需要重写程序,留下了一个遗憾。
另外,课上学习的链表内容我也没有完全掌握,似懂非懂,也希望能够在寒假的时候好好看看,确实学会C语言。
④多项修改功能。
该程序已有整体修改功能以及单个修改功能,但在实际应用中,可能还需要实现多项修改功能,比如同时修改两项等等。
这个想法一闪而过,我也并没有在上面研究研究,时间确实不够。
六、源代码清单
1#include<
stdio.h>
2#include<
windows.h>
3#include<
string.h>
4structinf
5charno[11];
6charname[18];
7charsex[5];
8intage;
9longwages;
10charedu[20];
11charaddr[40];
12chartelno[11];
13}member[100];
14intcmd1,cmd2;
15voidsave(intm)
16inti;
17FILE*fp;
18if((fp=fopen("
19printf("
20exit(0);
21for(i=0;
22if(fwrite(&
23printf("
24fclose(fp);
25intload()
26FILE*fp;
27inti=0;
28if((fp=fopen("
29printf("
30exit(0);
31else
32do
33fread(&
34i++;
35while(feof(fp)==0);
36fclose(fp);
37return(i-1);
38voidshow()
39intt;
40inti=load();
41printf("
42for(t=0;
43printf("