需求分析
1.1 设计系统的目的分析
本系统要求用 C 语言建立一个职工信息管理系统,本职工信息管理系统可以实现对众多员工信息的管理。包含对职工信息进行添加、查询、删除、修改。
1.2系统的界面要求
按任意键便可以进入主菜单,在主菜单上显示出该系统的功能,通过输入数字 0 到 6 来进行选择便可以实现用户所需要的功能,每个模块进入模块内部实现系统的具体功能,实现用户所需要的功能。
1.3主体功能分析
该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化
设计的思想。下面六个模块都是利用 C 语言文件文件操作,向文件中添加数据、修改数据、查询数据、删除数据和保存数据。
1.3.1创建、读取和写入文件
判断是否有存储信息用的文本文件,若无则提示需建立一个文件。
用 fopen()建立一个文本文件,然后向其中写入数据(例如,向文件中输
入“职工号”,“姓名”,“性别”,“年龄”“学历”,“工资”“住址”,“电话”),并对文件进行命名为a.txt。
1.3.2 添加职工信息
通过键盘输入职工人员的职工号、姓名、性别、年龄、职务电话号码、地址信息便可被添加到通讯录文件内,添加完毕后,系统会自动询问你是否继续添加,如你想继续添加,再通过键盘输入通讯录人员的姓名、电话号码、地址信息即可实现继续添加。
通过调用add()函数来添加职工信息,可以连续添加多个职工信息。
1.3.3 显示职工信息
通过前面第一个模块添加职工信息后,之后便可以执行第二个模块,通过第二个模块可以对已有的职工信息进行显示。
通过调用 browser()函数来进行显示所有的职工信息,browser()函数可以实现显示全部职工信息。
1.3.4 查询职工信息
调用search()函数来实现查询功能。查询可由四个方式进行:一是根据职工号进行查询,二是根据姓名进行查询。
1.3.5 删除职工信息
调用_delete()函数实现删除功能,删除可由两个方式进行:一是根据职工号进行删除,二是根据姓名进行删除。
1.3.6修改职工信息
调用 modify()函数来实现修改功能,提供了修改方法为根据职工号进行修改。
1.4 设计要求分析
①根据题目要求,运用所学知识,完成设计和实现工作,并按照书写规范,
撰写课程设计报告。
②进一步理解和运用结构化程序设计的思想和方法;
③掌握开发一个小型实用系统的基本方法;
④学会利用流程图表示算法。
⑤学会调试一个较长程序的基本方法,进一步掌握利用 C 语言进行程序设计的能力;
1.5软件的数据结构分析
1.5.1 软件的函数
本软件采用了不同的函数来进行定义不同模块的功能,通过调用不同的函数,可以实现不同的功能。软件中采用了五个主体函数来实现添加职工,修改职工,查找职工,显示职工,删除职工的功能。
1.5.2 文件的调用和保存
本系统通过文本方式对用户所添加的信息进行保存。通过保存下来的文本文件,用户可以在电脑磁盘中找到用户存入文件,进而可以找到用户所录入的职工信息。
概要设计
2.1 系统界面设计
做到整洁清楚,能够层层选择进行具体的操作,对用户的请求能够进行合适的反馈。既有输入界面,又有输出界面,每个界面都有详细的指引。
2.2 系统的数据(结构)设计
系统通过调用不同的函数来实现不同的功能,通过循环调用函数来实现反复输入,实现用户不同的需求。
用户通过代码中的scanf()函数从键盘上输入不同的数字选项,然后通过 swtich case()分支条件语句来实现对不同函数的调用,满足各种需求。
2.2.1 系统的文件功能
系统采用了文本文档进行存取,在 C 盘建立了一个a.txt 的文本文档用于存放用户输入的职工信息,打开 C 盘后就能直接看到用户录入的信息,做到简洁和方便。
2.3 系统的模块图
系统的模块图很直观的反映出软件能够实现的功能,由下面的模块图可以很
直观的看出该职工信息管理系统的添加职工信息、显示职工信息、删除职工信息、修改职工信息功能。
- 增加职工信息部分,有九个模块,一步步完善职工信息。
- 在显示联系人部分,直接显示所有职工信息。
- 查询职工信息部分,有四个模块,可通过按工号查询,按姓名查询,按学历查询,按职务查询,然后显示职工信息。
- 在修改职工信息部分,输入要修改的职工的工号,然后根据需要,修改职工的姓名,学历,职务,工资,住址,电话。
- 在删除职工信息模块,输入要删除的职工的工号,即可完成删除。
- 最后是退出模块,需要保存信息后退出。异常退出可能会导致数据丢失。
图1系统模块图
2.4 系统的流程图
由于系统流程图较为复杂,采用了分块画出程序流程图。
2.4.1 添加职工信息程序流程图
由添加职工的程序流程图可以看出,在添加职工板块上,有三种信息:
输入工号,姓名,性别,年龄,学历,职务,工资,住址,电话;输入完成后会提示是否继续输入,如果输入Y则继续输入,输入N后返回主菜单。
图2添加职工信息流程图
2.4.2 显示职工信息程序流程图
在主菜单上输入 2 后便可以显示职工信息。
图3显示职工信息流程图
2.4.3 查询职工流程图
在删除联系人流程图上,分为全部删除和单个删除功能,单个删除设计了按
照姓名删除和按电话号码删除两种选择,在删除时,系统都会询问您是否删除,
以免误删。
图4查询职工流程图
2.4.3 修改职工信息流程图
修改联系人界面,输入输入需修改的职工的工号即可。
修改项目:修改姓名,修改学历,修改职务,修改工资,修改地址,修改完毕后系统会提示您是否继续 ,输入Y修改,如不修改,则输入N又返回主界面等待输入。
图5修改职工信息流程图
详细设计
3.1 函数声明
- void read();//读取信息函数
- void write();//写入信息函数
- void menu();//菜单函数
- void add();//添加职工信息函数
- void show(int id);//显示职工信息函数
- void browser();//显示所有职工信息函数
- void search();//查询职工信息函数
- void modify();//修改职工信息函数
- void _delete();//删除职工信息函数
3.2 读取信息函数
- void read()//读入数据
- {
- FILE *fp;
- int i = 0;
- if( (fp = fopen("c:\\a.txt","r")) == NULL )
- {
- printf("请新建一个文本文件,文件名为a\n\n\n");
- system("pause");
- system("cls");
- return ;
- }
- fscanf(fp,"%d\n",&n);
- while(i < n)
- {
- fscanf(fp,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",work[i].ID,work[i].name,work[i].sex,work[i].age,work[i].edu,work[i].position,work[i].wage,work[i].address,work[i].tel);
- i ++;
- }
- fclose(fp);
- }
3.3写入信息函数
- void write()//写入数据
- {
- FILE *fp;
- int i = 0;
- if( (fp = fopen("c:\\a.txt","w")) == NULL )
- {
- printf("无法打开文件!\n");
- return ;
- }
- fprintf(fp,"%d\n",n);
- while(i < n)
- {
- fprintf(fp,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",work[i].ID,work[i].name,work[i].sex,work[i].age,work[i].edu,work[i].position,work[i].wage,work[i].address,work[i].tel);
- i ++;
- }
- fclose(fp);
- }
3.4菜单函数
- void menu()//菜单
- {
- printf("* * 职工信息管理系统菜单 * *\n");
- printf("* *\n");
- printf("* 1.添加职工信息 *\n");
- printf("* *\n");
- printf("* 2.显示职工信息 *\n");
- printf("* *\n");
- printf("* 3.查询职工信息 *\n");
- printf("* *\n");
- printf("* 4.修改职工信息 *\n");
- printf("* *\n");
- printf("* 5.删除职工信息 *\n");
- printf("* *\n");
- printf("* 0.退出 *\n");
- printf("* *\n");
- printf("* * * * * * * * * * * * * **\n");
- printf("请输入选项(0-5): ");
- }
3.5添加职工信息函数
- void add()// 从键盘输入
- {
- int i;
- int flag;//标记工号是否已存在
- char c;
- read();//输入数据前先将文件中原有的数据读入
- do
- {
- flag = 0;
- printf("请输入职工的工号: \n\t\t");
- scanf("%s",work[n].ID);
- for(i = 0 ; i < n ; i ++)
- {
- if(strcmp(work[i].ID,work[n].ID) == 0)
- {
- flag = 1;
- break;
- }
- }
- if(flag)
- {
- printf("该工号已存在!\n\n");
- printf("是否继续输入?(Y/N): ");
- scanf("%*c%c",&c);
- if(c == 'N' || c == 'n') break;
- continue;
- }
- printf("请输入职工的姓名: \n");
- scanf("%s",work[n].name);
- printf("请输入职工的性别: \n");
- scanf("%s",work[n].sex);
- printf("请输入职工的年龄: \n");
- scanf("%s",work[n].age);
- printf("请输入职工的学历: \n");
- scanf("%s",work[n].edu);
- printf("请输入职工的职务: \n");
- scanf("%s",work[n].position);
- printf("请输入职工的工资: \n");
- scanf("%s",work[n].wage);
- printf("请输入职工的住址: \n");
- scanf("%s",work[n].address);
- printf("请输入职工的电话: \n");
- scanf("%s",work[n].tel);
- printf("是否继续输入?(Y/N): ");
- scanf("%*c%c",&c);
- n ++;
- }while( c != 'N' && c != 'n');
- write();
- printf("\n\n数据已保存!\n\n");
- }
3.6显示职工信息函数
- void show(int id)
- {
- printf("职工号: %s\n",work[id].ID);
- printf("姓名: %s\n",work[id].name);
- printf("性别: %s\n",work[id].sex);
- printf("年龄: %s\n",work[id].age);
- printf("学历: %s\n",work[id].edu);
- printf("职务: %s\n",work[id].position);
- printf("工资: %s\n",work[id].wage);
- printf("住址: %s\n",work[id].address);
- printf("电话: %s\n",work[id].tel);
- printf("\n\n\n");
- }
3.7显示所有职工信息函数
- void browser()//显示所有职工信息
- {
- int i;
- read();
- if(n == 0) printf("无记录!\n\n");
- else
- for(i = 0 ; i < n ; i ++)
- {
- show(i);
- }
- }
3.8查询职工信息函数
- void search()//查询信息
- {
- char num;
- int flag,i;
- char s_id[20] ;//查询工号
- char s_name[20] ;//查询姓名
- char s_edu[20] ; //查询学历
- char s_position[20] ;//查询职位
- char c;//指令Y?N
- read();//打开程序后,要查询以前的数据,要先读入
- while(1)
- {
- system("cls");
- printf("* * * * * * * 查询* * * * * * *\n");
- printf("* *\n");
- printf("* 1.按工号查询 *\n");
- printf("* *\n");
- printf("* 2.按姓名查询 *\n");
- printf("* *\n");
- printf("* 3.按学历查询 *\n");
- printf("* *\n");
- printf("* 4.按职务查询 *\n");
- printf("* *\n");
- printf("* 输入其他任意键退出本模块 *\n");
- printf("* * * * * * * * * * * * * * * *\n");
- printf("请输入指令(1-4):");
- scanf("%*c%c",&num);
- if(num < '1' || num > '4')
- {
- printf("错误指令!\n\n");
- system("pause");
- continue;
- }
- system("cls");
- flag = 0;//用来标记职工信息是否存在
- if(num == '1')//按工号查询
- {
- printf("请输入您要查询职工的工号:");
- scanf("%s",s_id);
- for(i = 0 ; i < n ;i ++)
- {
- if( strcmp(work[i].ID,s_id) == 0)
- {
- show(i);
- flag = 1;//标记
- break;
- }
- }
- }
- else if(num == '2')//按姓名查询
- {
- printf("请输入您要查询职工的姓名:");
- scanf("%s",s_name);
- for(i = 0 ; i < n ;i ++)
- {
- if( strcmp(work[i].name,s_name) == 0)
- {
- show(i);
- flag = 1;//标记
- }
- }
- }
- else if(num == '3')//按学历查询
- {
- printf("请输入您要查询职工的学历:");
-
- scanf("%s",s_edu);
- for(i = 0 ; i < n ;i ++)
- {
- if( strcmp(work[i].edu,s_edu) == 0)
- {
- show(i);
- flag = 1;//标记
- }
- }
- }
- else if(num == '4')//按职务查询
- {
- printf("请输入您要查询职工的职务:");
- scanf("%s",s_position);
- for(i = 0 ; i < n ;i ++)
- {
- if( strcmp(work[i].position,s_position) == 0)
- {
- show(i);
- flag = 1;//标记
- }
- }
- }
- if(!flag)//判断是否有该职工信息
- {
- printf("\n\n无该职工信息!\n\n");
- }
- printf("\n\n是否继续查询(Y/N):");
-
- scanf("%*c%c",&c);
- if(c == 'N' || c == 'n') break;
- }
- }
3.9修改职工信息函数
- void modify()//修改职工信息
- {
- char change_ID[20];//需修改的职工的工号
- int number;//职工信息在数据中的位置
- char num;//指令
- char message[100];//修改的信息
- char c;//指令Y?N
- int flag;
- int i;
- read();
- while(1)
- {
- flag = 0;
- system("cls");
- printf("请输入需修改的职工的工号:");
- scanf("%s",change_ID);
- for(i = 0 ; i < n ; i ++)
- {
- if( strcmp(work[i].ID,change_ID) == 0 )
- {
- number = i;
- flag = 1;
- break;
- }
- }
- if(!flag)
- {
- printf("\n\n无此员工信息!!\n\n");
- printf("\n\n是否继续修改(Y/N):");
- scanf("%*c%c",&c);
- if(c == 'N' || c == 'n') break;
- continue;
- }
- printf("\n\n* * * * * * * * 修改* * * * * * *\n");
- printf("* *\n");
- printf("* 1.修改姓名 *\n");
- printf("* *\n");
- printf("* 2.修改学历 *\n");
- printf("* *\n");
- printf("* 3.修改职务 *\n");
- printf("* *\n");
- printf("* 4.修改工资 *\n");
- printf("* *\n");
- printf("* 5.修改住址 *\n");
- printf("* *\n");
- printf("* 6.修改电话 *\n");
- printf("* *\n");
- printf("* 输入其他任意键退出本模块 *\n");
- printf("* * * * * * * * * * * * * * * * *\n");
- printf("请输入指令(1-6):");
- scanf("%*c%c",&num);
- if(num < '1' || num > '6')
- {
- printf("错误指令!\n\n");
- system("pause");
- continue;
- }
- system("cls");
- printf("请输入修改后的信息:");
- scanf("%s",message);
- switch(num)
- {
- case '1' : strcpy(work[number].name,message); break;
- case '2' : strcpy(work[number].edu,message); break;
- case '3' : strcpy(work[number].position,message); break;
- case '4' : strcpy(work[number].wage,message); break;
- case '5' : strcpy(work[number].address,message); break;
- case '6' : strcpy(work[number].tel,message); break;
- }
- system("cls");
- printf("\n\n是否继续修改(Y/N):");
- scanf("%*c%c",&c);
- if(c == 'N' || c == 'n') break;
- }
- write();
- }
3.10删除职工信息函数
- void modify()//修改职工信息
- {
- char change_ID[20];//需修改的职工的工号
- int number;//职工信息在数据中的位置
- char num;//指令
- char message[100];//修改的信息
- char c;//指令Y?N
- int flag;
- int i;
- read();
- while(1)
- {
- flag = 0;
- system("cls");
- printf("请输入需修改的职工的工号:");
- scanf("%s",change_ID);
- for(i = 0 ; i < n ; i ++)
- {
- if( strcmp(work[i].ID,change_ID) == 0 )
- {
- number = i;
- flag = 1;
- break;
- }
- }
- if(!flag)
- {
- printf("\n\n无此员工信息!!\n\n");
- printf("\n\n是否继续修改(Y/N):");
- scanf("%*c%c",&c);
- if(c == 'N' || c == 'n') break;
- continue;
- }
- printf("\n\n* * * * * * * * 修改* * * * * * *\n");
- printf("* *\n");
- printf("* 1.修改姓名 *\n");
- printf("* *\n");
- printf("* 2.修改学历 *\n");
- printf("* *\n");
- printf("* 3.修改职务 *\n");
- printf("* *\n");
- printf("* 4.修改工资 *\n");
- printf("* *\n");
- printf("* 5.修改住址 *\n");
- printf("* *\n");
- printf("* 6.修改电话 *\n");
- printf("* *\n");
- printf("* 输入其他任意键退出本模块 *\n");
- printf("* * * * * * * * * * * * * * * * *\n");
- printf("请输入指令(1-6):");
- scanf("%*c%c",&num);
- if(num < '1' || num > '6')
- {
- printf("错误指令!\n\n");
- system("pause");
- continue;
- }
- system("cls");
- printf("请输入修改后的信息:");
- scanf("%s",message);
- switch(num)
- {
- case '1' : strcpy(work[number].name,message); break;
- case '2' : strcpy(work[number].edu,message); break;
- case '3' : strcpy(work[number].position,message); break;
- case '4' : strcpy(work[number].wage,message); break;
- case '5' : strcpy(work[number].address,message); break;
- case '6' : strcpy(work[number].tel,message); break;
- }
- system("cls");
- printf("\n\n是否继续修改(Y/N):");
- scanf("%*c%c",&c);
- if(c == 'N' || c == 'n') break;
- }
- write();
- }
3.11主函数
- int main()
- {
- int num;
- n = 0;
- while(1)
- {
- menu();
- scanf("%d",&num);
- system("cls");
- switch(num)
- {
- case 1: add(); break;
- case 2: browser(); break;
- case 3: search(); break;
- case 4: modify(); break;
- case 5: _delete(); break;
- case 0: printf("谢谢使用!\n\n"); return 0;
- default :printf("\n--->无效的指令!\n\n\n");
- }
- system("pause");
- system("cls");
- }
- }
以上代码为完整代码,代码测试就自己试试吧。
如果对你有帮助请支持一下哦。