目录
- 计算机综合课程任务设计书.......................................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");
}