📄 workermanage.cpp
字号:
#include <string.h>
#include<iostream>
#include <fstream>
#include <malloc.h>
#ifdef WIN32
#define TEMP_FILE "职工系统.bin"
#endif
#include <vector>
#include <vector>
using namespace std;
struct workNode
{
int workerno;
char workername[10];
int departmentno;
char sex;
float salary;
};
typedef struct workNode Work;
typedef Work *pWork;
typedef std::vector<Work> WorkArray;
int pivotkey;
int pivotloc;
bool Insert(WorkArray &pointer)
{//在原有的数组后插入元素,边插边分配单元
pWork poi;
poi=(pWork)malloc(sizeof(Work));
int FLAG,mark;
FLAG=1;
printf("请输入职工信息(退出输入**请将职工号输为--000):\n");
while(FLAG)
{
printf("职工号:");
scanf("%d",&poi->workerno);
if(poi->workerno!=000)
{
printf("职工姓名:");
scanf("%s",&poi->workername);
getchar();
printf("性别(f/F或m/M):");
poi->sex = getchar();
if(poi->sex== 'f'||poi->sex== 'F'||poi->sex== 'm'||poi->sex== 'M')
mark = 1;
else mark = 0;
while(!mark)
{
printf("您输入的不正确请输(f/F或m/M):");
getchar();
poi->sex = getchar();
if(poi->sex== 'f'||poi->sex== 'F'||poi->sex== 'm'||poi->sex== 'M')
mark = 1;
else mark = 0;
}
printf("部门号:");
scanf("%d",&poi->departmentno);
printf("工资:");
scanf("%f",&poi->salary);
printf("下一位职工信息(退出输入**请将职工号输为--000):\n");
}
else
FLAG=0;
if(FLAG)
{
pointer.push_back(*poi);
}
}
return 1;
}
int Partition(WorkArray &Array,int low,int high)
{//交换表中[low,high]的记录,枢轴记录到位,并返回其所在位置,
//此时在他之前(后)的记录均不大(小)于他
Work mark;
mark = Array[low];//表中的第一个记录作枢轴记录
pivotkey = Array[low].workerno;//枢轴记录关键字
while(low < high)
{//从表的两端交替地向中间扫描
while(low < high && Array[high].workerno >= pivotkey) --high;
Array[low] = Array[high];//将比枢轴记录小的记录移到低端
while(low < high && Array[low].workerno <= pivotkey) ++low;
Array[high] = Array[low];//将比枢轴记录大的记录移到高端
}
Array[low] = mark;//枢轴记录到位
return low;//返回枢轴位置
}
void QuickSort(WorkArray &Array,int low,int high)
{//对表做快速排序
if(low < high)
{//长度大于1
pivotloc = Partition(Array,low,high);//将low,high一分为二
QuickSort(Array,low,pivotloc-1);//对低子表递归排序,pivotloc是枢轴位置
QuickSort(Array,pivotloc+1,high);//对高子表递归排序
}
}
int Search(WorkArray &Array,int Key)
{//在有序表中二分查找其关键字等于Key的数据元素.若找到,则函数值为
//该元素在表中的位置,否则为0
int mid,low,high;
low = 0;//置区间初值
high = Array.size()-1;
while(low <= high)
{
mid = (low + high)/2;
if(Key == Array[mid].workerno) //找到待查元素
return mid;
else if(Key < Array[mid].workerno) high = mid - 1;//继续在前半区间进行查找
else low = mid + 1;//继续在后半区间进行查找
}
return -1;//表中不存在待查元素
}
void Delete(WorkArray &Array)
{//调用Search()函数查找要删除元素的位置,然后将其删除
int number,Mark;
printf("输入待删除的职工号:");
scanf("%d",&number);
Mark = Search(Array,number);
if(Mark != -1)
{
while(Mark < Array.size()-1)
{
Array[Mark] = Array[Mark+1];
Mark++;
}
if(Mark == Array.size()-1)
Array.pop_back();//去掉最后一个元素
printf("删除工作已完成!!\n");
}
else printf("此职工信息已不存在!!\n");
}
void Display(WorkArray &res,int l)
{//显示所有未被删除的职工信息
int k;
for(k=0;k<l;k++)
{
printf("res[%d].职工号=%d\n",k,res[k].workerno);
printf("res[%d].职工姓名=%s\n",k,res[k].workername);
printf("res[%d].性别=%c\n",k,res[k].sex);
printf("res[%d].部门号=%d\n",k,res[k].departmentno);
printf("res[%d].工资=%f\n",k,res[k].salary);
printf("\n");
}
}
void SaveFile(int *flag,WorkArray &temp)
{//保存职工信息
WorkArray temp0;
if(*flag)
{
fstream Savetemp;
Savetemp.open(TEMP_FILE,ios::in|ios::out|ios::binary);// |ios::app
int i;
Work tem;
int MMx=temp.size();
Savetemp.seekg(0,ios::beg);
for(i=0;i<MMx;i++)
{
Savetemp.write(reinterpret_cast <char*>(&temp[i]),sizeof(Work));
}
int m=sizeof(Work);
Savetemp.seekg(0,ios::beg);
for(i=0;i<MMx;i++)
{
Savetemp.read(reinterpret_cast<char*>(&tem),sizeof(Work));
temp0.push_back(tem);
}
Savetemp.close;
}
}
void main()
{
WorkArray Container;
int flag,oper,Key,i;
Insert(Container);
printf("\n插入操作——————按1\n");
printf("查询操作——————按2\n");
printf("删除操作——————按3\n");
printf("排序操作——————按4\n");
printf("输出操作——————按5\n");
printf("保存操作——————按6\n");
printf("退出操作——————按0\n");
scanf("%d",&oper);
while(oper != 0)
{
switch(oper)
{
case 1: Insert(Container);//插入
break;
case 2: printf("请输入待查的职工号:");
scanf("%d",&Key);
i = Search(Container,Key);//查询
printf("查询结果为:\n");
if(i != -1)
{
printf("Container[%d].职工号=%d\n",i,Container[i].workerno);
printf("Container[%d].职工姓名=%s\n",i,Container[i].workername);
printf("Container[%d].性别=%c\n",i,Container[i].sex);
printf("Container[%d].部门号=%d\n",i,Container[i].departmentno);
printf("Container[%d].工资=%f\n",i,Container[i].salary);
}
else
printf("\n该表中不存在此职工信息或已被删除!!\n");
break;
case 3: Delete(Container);//删除
break;
case 4: QuickSort(Container,0,Container.size()-1);//排序
printf("排序工作已完成!!\n");
break;
case 5: printf("职工系统信息为:\n");
Display(Container,Container.size());//输出显示
break;
case 6: flag = 1;
printf("文件已保存!!\n");
SaveFile(&flag,Container);//保存
break;
}
printf("\n请给出下一步操作的提示:\n");
scanf("%d",&oper);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -