职工管理系统

目录

  • 计算机综合课程任务设计书.......................................1

1.1 功能介绍...................................................1

1.2 课程设计要求...............................................1

  • 系统设计.......................................................2

2.1 总体结构...................................................2

2.2 设计思路...................................................2

  • 模块设计.......................................................3

3.1 预处理及函数声明...........................................3

3.2 结构体数组.................................................3

3.3 主函数.....................................................3

3.4 录入职工信息...............................................4

3.5 浏览职工信息...............................................4

3.6 查询职工信息...............................................4

3.7 职工信息排序...............................................5

3.8 删除职工信息...............................................5

3.9 修改职工信息...............................................5

  • 调试与测试.....................................................6
  • 设计总结.......................................................9
  • 心得体会.......................................................10
  • 参考文献.......................................................10
  • 源程序附页.....................................................11

一、计算机综合课程任务设计书

1.1 功能介绍

职工信息管理系统

职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。

功能:

a) 系统以菜单方式工作
b) 职工信息录入功能(职工信息用文本文件形式保存) 
c) 职工信息浏览功能
d) 查询和排序功能: 
l 按工资查询
l 按学历查询等
e) 职工信息删除功能

f) 职工信息修改功能

2.2 课程设计要求

(1)设计总体要求:

2采用模块化程序设计;

3鼓励可视化编程;

4源程序中应有足够的注释;

5学生可自行增加新功能模块(视情况可另外加分);

6必须上机调试通过;

7注重算法运用,优化存储效率与运算效率;

8需提交源程序(含有注释)及相关文件(数据或数据库文件)

9提交设计报告书

  • 系统设计

2.1 总体结构

   主函数采用switch--case选择结构,采用模块化程序设计的思想,基本按照任务要求,将系统分为多个功能模块,每一个功能模块对应一个或多个自定义函数。

    流程图如下:

2.2 设计思路

首先,定义一个结构体数组,其中包括:职工号、姓名、性别、年龄、学历、工资、住址、电话定义一个主函数,使得输入一个序号(1-7)后,可以调用相应的函数、执行相应的功能;调用主菜单函数,使系统以菜单的方式工作;自定义职工信息录入函数,依次录入职工信息并保存;自定义职工信息浏览函数,实现浏览职工信息;自定义职工信息查询系统,再次使用switch--case选择语句,实现按照工资查询和按照学历查询;自定义职工信息删除函数,实现删除职工信息的功能;自定义职工信息修改系统,使得系统可以修改错误录入的职工信息;自定义职工排序系统,使得录入的职工信息以职工号有小到大排序。 

  • 模块设计

3.1 预处理及函数声明

   

        预处理中加入了#include <cstdio>、#include <cstdlib>、#include <windows.h>、#include <string>,因为调用了fopen、fwrite、exit(程序终止执行,返回调用过程)、system("cls")实现清屏、字符串替换函数等函数。然后对所有自定义函数进行了函数声明。

3.2 结构体数组

    

随后定义了一个结构体数组,使其依次含有职工号、姓名、性别、年龄、学历、工资、住址、电话成员,并且共定义了100个struct work类型的变量。该结构体是实现其他功能函数的基础。

3.3 主函数

主函数采用switch--case选择结构,输入不同的序号后可以调用相应的函数实现相应的功能。

首先调用菜单函数,实现页面以菜单形式展现,然后让使用者输入相应的序号,1.录入职工信息、2.浏览职工信息、3.查询职工信息、4.删除职工信息、5.修改职工信息、6.职工信息排序、7.退出职工系统。

下面将以此介绍这些功能函数。

3.4 录入职工信息

 

利用循环语句实现依次录入每个员工的信息,并报存在文件中。

3.5 浏览职工信息

  

        利用循环语句实现依次输出每个员工的信息,供使用者浏览。

3.6 查询职工信息

        

        自定义查询职工信息函数,利用switch--case函数实现题目要求,

可以让使用者选择按工资查询或者按学历查询。

     

     自定义按照工资查询职工信息的函数,利用循环结构依次对照各个职工的工资与所要查询的工资是否相同,并将相同的职工信息输出。与此类似的定义按照学历查询职工信息的函数,不同的是此处调用了字符串比较函数。

3.7 职工信息排序

自定义职工信息排序函数,实现职工信息按照职工号有小到大排序。

3.8 删除职工信息

    

        自定义删除职工信息函数,通过输入职工号删除职工信息,同时将后面的职工信息向前移动一行。

3.9 修改职工信息

自定义修改职工信息函数,首先输入要修改的职工号,找到该职工后,输入要修改的部分,利用选择结构找到相应的部分并替换。

  • 调试与测试

   1.生成解决方案并启动调试后页面如下:

   

   2.按照提示录入相应的职工信息:

        

   3.浏览职工信息:

    4.查询职工信息:

     (此处只展示按照工资查询)

5.删除职工信息:

    6.修改职工信息:

    7.职工信息排序:

    8.退出职工信息管理系统:

  • 设计总结

选定这一题目后,很久没有思路,主要原因是本人上学期学习了C++,该学期学习了matlab,因此对于上学期所学的知识有所遗忘。所以我先用一些时间复习了上学期所学的C++相关知识,熟悉掌握循环语句、选择语句、函数的定义、函数的调用、结构体的定义等基础知识。

万事开头难,复习完基础知识后,我开始构思系统设计的整体框架,利用网络查阅了大量资料,同时阅读了大量的相关文章。每次遇到不懂的地方,先查看书籍的相应位置,再利用网络查阅相关文章。如果还有不理解的地方再向老师和同学请教。

例如:录入职工信息之后需要保存,由于上学期并没有学习该知识点,所以最初的代码录入职工信息后无法保存因此也无法进行后续操作。在大量查阅资料和文章后,我学会了利用save函数和read函数进行保存、导入和读取,并最终解决了该问题。

再例如:调用函数时需要输入不同的预处理命令、文件包含命令,因此我特意在网络中查找了各个函数对应的头文件。如图:

  

最终克服困难,把问题逐一解决。

  • 心得体会

编写代码、设计程序是一个发现问题并解决问题的过程,是一个学习并不断进步的过程,更是一个有趣并富有挑战性的事情。

首先,编写代码并生成程序,用自己所设计的程序解决相应的问题,比如:我此次设计的职工信息管理系统程序可以录入、保存、浏览、修改、删除职工的信息,正是因为我们生活中存在这样的问题,所以我们才可以利用C++等程序设计系统和语言去解决问题。也正因如此,编写代码、设计程序是一个发现问题并解决问题的过程。

其次,编写程序是一个逻辑十分严谨的事情,大到每一个函数的定义与调用,小到每一个符号语言,丝毫的差错就可能造成调试失败或者得不到自己想要的结果。而Microsoft Visual Studio 2010在编写代码时会用红线标出错误的地方,因此我们可以在编写代码的同时不断改进、不断完善、不断学习。使自己编写代码的能力得到提升。

最后,编写程序是一个有趣并富有挑战性的事情。尤其是编写一段很长的代码去解决一系列问题或者生成一个系统时,敲代码的过程是十分有趣的,更有趣的是,当自己的代码成功运行、调试成功后,自己会产生很强的成就感。或许过程并非一帆风顺,但是只要我们勇于尝试、不断改进,终究会有成功的那一刻。

总之,经过这次程序设计,我对编写程序更加喜欢,相信自己会在敲代码的路上越走越远!

八、源程序附页

#include <iostream>

#include <cstdio>          //包含fopen、fwrite

#include <cstdlib>        //包含exit(程序终止执行,返回调用过程)

#include <windows.h> //system("cls");清屏

#include <string>        //字符串操作头文件

using namespace std;

struct work {               //员工信息结构体

int number;            //职工号号

char name[20];      //姓名

char sex;                // 性别

char year[20];        // 年龄

char education[20]; //学历

float wages;           //工资

char  addr[20];       //住址

int Tel;                   //电话

};

struct work worker[100], worker1;

//功能函数声明

void menu();           //主菜单

void input();           //输入员工信息

void save(int m);    //存储信息

int  read();             // 读取信息

void display();       //浏览信息

void search();        //查询

void search_education();  //按学历查询

void search_wages();  //按工资查询

void Delete();         //删除操作

void change();      //修改操作

void sort();            //排序操作

void sort_Num();  //按职工号排序      浏览信息时按照职工号由小到大顺序排序

//主函数

int main()

{

system("color F4");       //设置输出字体及背景颜色

int n;

while (1)       //正常程序里,用来等待中断的产生

{

menu();      //调用菜单函数

cout << "尊敬的领导,请您输入您需要操作的序号(1-7):  ";

cin>>n;

if (n == 0)

{

cout << "输入错误,请重新输入!\n";

system("pause");

fflush(stdin);   //清理标准输入流

continue;

}

switch (n) {

case 1:   system("cls");

cout << "\n";

cout << "\t\t\t  录入职工信息\n\n";

input();

break;         

case 2:   system("cls");

cout << "\n";

cout << "\t\t\t\t浏览职工信息\n";

display();                //调用浏览函数

cout << "\n按Enter键继续\n";

getchar();                //以字符为单位对数据进行读取

getchar();

system("cls");

break;          

case 3:   system("cls");

cout << "\n";

cout << "\t\t\t\t查询职工信息\n";

search();

break;            

case 4:   system("cls");

cout << "\n";

cout << "\t\t\t\t删除职工信息\n\n";

Delete();

case 5:   system("cls");

cout << "\n";

cout << "\t\t\t\t修改职工信息\n";

display();                   //调用浏览函数  

change();

break;          

case 6:   system("cls");

cout << "\n";

cout << "\t\t职工信息排序\n";

sort();

break;          

case 7:   system("cls");

cout << "\n\n\n\n\n\n\t\t\tThank you for using !\n\n\n\n\n\n";

getchar();

getchar();

exit(8);

break;           //执行到相应程序跳出switch

}

}

}

//其他函数

void menu()   //主菜单

{

cout << "\n\n";

cout << "        东南科技有限公司职工信息管理系统       \n\n";

cout << "******************************************\n";

cout << "*             1.录入职工信息             *\n";

cout << "*             2.浏览职工信息             *\n";

cout << "*             3.查询职工信息             *\n";

cout << "*             4.删除职工信息             *\n";

cout << "*             5.修改职工信息             *\n";

cout << "*             6.职工信息排序             *\n";

cout << "*             7.退出职工系统             *\n";

cout << "******************************************\n";

cout << "\n";

}

void input()       //录入职工信息

{

int i, m, num;

char s = 'W';

char t = 'M';

char sex;

cout << "尊敬的领导,请您输入需要创建信息的职工人数: ";

cin>>m;

system("cls");

cout << "\n";

for (i = 0;i < m;i++)            //循环录入m个职工信息

{

cout << "第"<<i+1<<"个员工信息输入:\n";

cout << "请输入职工号: ";

cin>>num;

for (int j = 0;j < i;j++)

while (worker[j].number == num)     //判断输入的职工号是否与原来的重复(题目要求职工号不可以重复)

{

cout << "职工号为 "<<num<<"的员工已存在,请重新输入:\n";

cin>>num;

}

worker[i].number = num;             //将重新输入的职工号录入程序中

cout << "请输入姓名:  ";

cin>>worker[i].name;

do

{

cout << "请输入性别(W/M):  ";

getchar();

cin>>worker[i].sex;

if (worker[i].sex == s || worker[i].sex == t)

{

break;

}

else

{

cout << "对不起,您输入格式错误,请重新输入!\n";

}

} while (1);

cout << "请输入年龄:  ";

cin>>worker[i].year;

cout << "请输入学历:  ";

cin>>worker[i].education;

do

{

cout << "请输入工资:  ";

cin>>worker[i].wages;

if (worker[i].wages > 0)

{

break;

}

else

{

cout << "对不起,您输入格式错误,请重新输入!\n";

}

} while (1);

cout << "请输入住址:  ";

cin>>worker[i].addr;

do

{

cout << "请输入电话:  ";

cin>>worker[i].Tel;

if (worker[i].Tel > 0)

{

break;

}

else

{

cout << "对不起,您输入格式错误,请重新输入!\n";

}

} while (1);

system("cls");

cout << "\n一个新职工的信息创建完成!\n\n";

}

save(m);      //保存入文件中

}

void save(int m)    //保存文件函数 (该函数参考了网络中相关文章)

{

int i;

FILE *fp;

if ((fp = fopen("D:\\work_list.txt", "wb")) == NULL)  //创建文件并判断是否能打开

{

cout << "cannot open file!\n";

exit(0);

}

for (i = 0;i < m;i++)        //将内存中职工的信息输出到磁盘文件中

if (fwrite(&worker[i], sizeof(struct work), 1, fp) != 1)

cout << "file write error!\n";

fclose(fp);

}

int read()    //导入函数 (该函数参考了网络中相关文章)

{

FILE*fp;

int i = 0;

if ((fp = fopen("D:\\work_list.txt", "rb")) == NULL)

{

cout << "cannot open file!\n";

exit(0);

}

else

{

do {

fread(&worker[i], sizeof(struct work), 1, fp);

i++;

} while (feof(fp) == 0);

}

fclose(fp);

return(i - 1);

}

void display()  //浏览职工信息

{

int i;

int m = read();   //读取文件

cout << "\n贵公司所有职工信息:\n";

cout << "\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话\n";

for (i = 0;i < m;i++)

cout <<worker[i].number<<"\t"<<worker[i].name<<"\t"<<worker[i].sex<<"\t"<<worker[i].year<<"\t"<<worker[i].education<<"\t"<<worker[i].wages<<"\t"<<worker[i].addr<<"\t"<<worker[i].Tel<<"\n";

cout << "\n";

}

void Delete()   //删除职工信息

{

int m = read();            //读取文件

int i, j, t, n, f, Num;      //f用于调用第一个switch中的函数   t用于下面第二个switch语句调用Delete和返回   n用于下面确认是否删除

display();                    //调用浏览职工信息函数

cout << "请您输入要删除的职工的职工号:  ";

cin>>Num;

for (i = 0, f = 1;f&&i < m;i++)             //遍历全部职工

{

if (worker[i].number == Num)     //判断输入职工号是否与原职工号相同

{

cout << "\n已找到此人,原始记录为:\n";

cout << "\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t 电话\n";

cout <<worker[i].number<<"\t"<<worker[i].name<<"\t"<<worker[i].sex<<"\t"<<worker[i].year<<"\t"<<worker[i].education<<"\t"<<worker[i].wages<<"\t"<<worker[i].addr<<"\t"<<worker[i].Tel<<"\n";

cout << "\n确认删除请按 1,取消删除请按 0: ";

cin>>n;

if (n == 1)   //如果删除,则其他的信息都向前移一行  

{

for (j = i;j < m - 1;j++)

worker[j] = worker[j + 1];      //当找到第j个职工时,for语句后j自加了1,所以下面的应该把改后的信息赋值给第j-1个人     

f = 0;

}

else f = 2;

}

}

system("cls");

switch (f) {

case 0: m = m - 1;

cout << "\n\t\t\t\t删除成功!\n";

save(m);     //调用保存函数    

display();  //调用浏览函数

break;

case 1: cout << "\n\t\t\t对不起,贵公司没有该员工!\n";

display();  //调用浏览函数

break;

case 2: cout << "\n\t\t\t\t取消删除!\n";

break;

}

cout << "\n继续删除请按1,返回主菜单请按0: ";

cin>>t;    //输入t调用switch中的函数

system("cls");

switch (t)

{

case 1:  Delete();

break;

case 0:  system("cls");

main();

break;

default: break;

}

system("cls");

}

void search()       //查询职工信息

{

int t;

do {

cout << "\n 工资查询请按 1;   学历查询请按 2;  进入主菜单请按 0 : ";

cin>>t;     //输入数字对应操作选项

if (t >= 0 && t <= 3)

{

break;

}

else { cout << "您输入有误,请重新选择!"; }

} while (0);

system("cls");

while (1)

{

switch (t)

{

case 0: main();

break;

case 1: cout << "\n按工资查询\n";

search_wages();

break;

case 2: cout << "\n按学历查询\n";

search_education();

break;

default:break;

}

system("cls");

}

}

void search_wages()//按工资查询职工信息

{

int wages1;

int i, t, n = 0;

int m = read();

cout << "\n请输入要查找的工资:  ";

cin>>wages1;

for (i = 0;i < m;i++)    //遍历  

if (wages1 == worker[i].wages)

{

if (n == 0)

{

cout << "\n已找到以下信息:\n";

cout << "\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话\n";

}

n++;

cout <<worker[i].number<<"\t"<<worker[i].name<<"\t"<<worker[i].sex<<"\t"<<worker[i].year<<"\t"<<worker[i].education<<"\t"<<worker[i].wages<<"\t"<<worker[i].addr<<"\t"<<worker[i].Tel<<"\n";

}

if (n == 0)  //没有一个符合条件

{

cout << "\n对不起,贵公司没有该员工!\n";

getchar();

getchar();

}

else

{

cout << "\n查询到有"<<n<<"个员工符合要求。\n";

cout << "\n";

cout << "删除员工请按 1,修改信息请按 2,继续查询请按 3,返回上一层请按 4,返回主菜单请按 0 :";

cin>>t;       //输入数字对应操作选项

switch (t)

{

case 0: system("cls");

main();

break;

case 1: Delete();

break;

case 2: change();

break;

case 3: break;

case 4: system("cls");

search();

break;

default:break;

}

}

}

void search_education()//按学历查询职工信息

{

char education1[20];   //定义一个数组指向字符串

int i, t, n = 0;

int m = read();

cout << "\n请输入要查找的学历:  ";

cin>>education1;

for (i = 0;i < m;i++)    //遍历  

if (strcmp(education1, worker[i].education) == 0) //strcmp对两个字符串进行比较

{

if (n == 0)

{

cout << "\n已找到以下信息:\n";

cout << "\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n";

}

n++;

cout <<worker[i].number<<"\t"<<worker[i].name<<"\t"<<worker[i].sex<<"\t"<<worker[i].year<<"\t"<<worker[i].education<<"\t"<<worker[i].wages<<"\t"<<worker[i].addr<<"\t"<<worker[i].Tel<<"\n";

}

if (n == 0)  //没有一个符合条件

{

cout << "\n对不起,贵公司没有该员工!\n";

getchar();

getchar();

}

else

{

cout << "\n查询到有"<<n<<"个员工符合要求。\n";

cout << "\n";

cout << "删除员工请按 1,修改信息请按 2,继续查询请按 3,返回上一层请按 4,返回主菜单请按 0 :";

cin>>t;       //输入数字对应操作选项

switch (t)

{

case 0: system("cls");

main();

break;

case 1: Delete();

break;

case 2: change();

break;

case 3: break;

case 4: system("cls");

search();

break;

default:break;

}

}

}

void change()     //修改职工信息

{

int number;       //职工号

char name[20];     //姓名

char sex;        // 性别

char year[20];          // 年龄

char education[20]; //学历

float wages;        //工资

char  addr[20];     //住址

int Tel;      //电话

int b = 1, c, i, n, t, k = 0, g;

int m = read();               //导入文件内的信息

cout << "\n";

cout << "请输入要修改的职工的职工号:  ";

cin>>number;

system("cls");

for (i = 0;i < m;i++)

{

if (worker[i].number == number)    //判断输入的职工号是否与原职工号相同

{

k = 1;

cout << "\n已找到该职工号员工,其记录为:\n";

cout << "\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话\n";

cout <<worker[i].number<<"\t"<<worker[i].name<<"\t"<<worker[i].sex<<"\t"<<worker[i].year<<"\t"<<worker[i].education<<"\t"<<worker[i].wages<<"\t"<<worker[i].addr<<"\t"<<worker[i].Tel<<"\n"; cout << "\n确认修改请按1,取消修改请按0:";

cin>>n;

if (n == 1)

{

cout << "\n需要进行修改的选项\n 1.职工号  2.姓名  3.性别  4.年龄  5.学历  6.工资  7.住址  8.电话  \n";

cout << "请输入你想修改的那一项序号:  ";

cin>>c;               //输入数字对应操作选项   

do {

switch (c)

{

case 1: cout << "职工号改为: ";

cin>>g;

for (int i = 0;i < m;i++)

while (worker[i].number == g)    //判断输入的职工号是否与原来的重复

{

cout << "职工号为 %d 的员工已存在,请重新输入:\n", g;

cin>>g;

}

worker[i].number = g;         //将重新输入的职工号录入程序中

break;

case 2: cout << "姓名改为: ";

cin>>name;

strcpy(worker[i].name, name);

break;

case 3: cout << "性别改为:";

getchar();

cin>>sex;

worker[i].sex = sex;

break;

case 4: cout << "年龄改为: ";

cin>>year;

strcpy(worker[i].year, year);

break;

case 5: cout << "学历改为: ";

cin>>education;

strcpy(worker[i].education, education);

break;

case 6: cout << "工资改为: ";

cin>>wages;

worker[i].wages = wages;

break;

case 7: cout << "住址改为: ";

cin>>addr;

strcpy(worker[i].addr, addr);

break;

case 8: cout << "电话改为: ";

cin>>Tel;

worker[i].Tel = Tel;

break;

}

cout << "\n确认修改 请按1,重新输入 请按2:   ";

cin>>b;

if (b == 1)

{

system("cls");

save(m);//储存修改后的数据

cout << "\n";

display();//浏览修改后的数据

}

} while (b == 2);

}

}

else if (i == (m - 1)) i++;

}

if (k == 0) {

cout << "\n对不起,您输入有误!\n";

getchar();

getchar();

}

else {

cout << "\n继续修改请按 1,退出修改请按 0:  ";

cin>>t;

}

system("cls");

switch (t)

{

case 1: display();

change();//返回修改函数

break;

case 0: break;

default:break;

}

system("cls");

}

void sort()//排序职工信息    

{

int d;

do {

cout << "\n职工号排序请按 1:; 返回主菜单请按 0:  ";

cin>>d;

if (d >= 0 && d <= 1)

{

break;

}

else

{

cout << "对不起,您输入有误,请重新选择!";

}

} while (0);

system("cls");

while (1) {

switch (d)

{

case 1: cout << "\n按职工号排序为(数字由小到大排列):\n";

sort_Num();

break;

case 0: system("cls");

main();

break;

}

system("cls");

}

}

void sort_Num()//按职工号排序函数    //浏览信息时按照职工号由小到大顺序排序

{

int i, j, k;

int m = read();

for (i = 0;i < m - 1;i++)

for (j = 0;j < m - 1 - i;j++)

if (worker[j].number > worker[j + 1].number)//排序   

{

worker1 = worker[j];

worker[j] = worker[j + 1];

worker[j + 1] = worker1;

}

save(m); //按职工号由小到大的顺序存储

cout << "\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话\n";

for (i = 0;i < m;i++)

cout <<worker[i].number<<"\t"<<worker[i].name<<"\t"<<worker[i].sex<<"\t"<<worker[i].year<<"\t"<<worker[i].education<<"\t"<<worker[i].wages<<"\t"<<worker[i].addr<<"\t"<<worker[i].Tel<<"\n"; cout << "\n确认排序请按1,取消排序请按0:";

cin>>k;

switch (k)

{

case 1: system("cls");

sort(); //调用排序函数

break;

case 0: system("cls");

main();

break;

default:break;

}

system("cls");

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值