一、设计任务
1.1设计题目的描述
(1)了解并掌握算法的设计方法,具备初步的独立分析和设计能力;
(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
(4)要求利用结构化编程思想来完成系统的设计;
(5)在系统的设计中,要有清晰的界面设计,同时采用文件进行读写操作。
二、设计要求
2.1、问题描述
某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。
2.2、需求分析
1.其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。
2.程序对所有人员有提升级别的功能
3.月薪的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成 ,销售经理既拿固定月薪也领取销售提成。
4.能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息。
三、算法的基本思想
1.涉及到的数据结构
struct employee
{
int id;//编号
char no; //职工号
char name[40]; //职工姓名
char sex[10]; //职工性别
int age; //职工年龄
int rand;//级别
int hour; //兼职小时
int num; //销售量
int slary;
struct employee* next;//下一结点指针
};
typedef struct employee EMP;
主函数模块。
- 函数原形:int main();
- 功能:调用menu()函数,显示主界面
创建员工信息模块
- 函数原形:EMP* creat(EMP* h)
- 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,先判断链表是否为空,根据判断进行处理,并按照不同职工类型创建员工信息,返回一个EMP类型的指针
查找员工信息模块
1) 函数原形: void found(EMP* p1)
2) 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表根据员工id进行匹配,找到后进行显示员工信息,否则返回
提升员工等级信息模块
1)函数原形: void promote(EMP* p1);
2) 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表,根据员工id进行匹配,找到后进行修改,否则返回
修改员工信息模块
1)函数原形: void Modi(EMP* p1)
2) 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表根据员工id进行匹配,找到后进行信息修改,否则返回
删除员工信息模块
1)函数原形: EMP* delete(EMP* p1)
2) 功能:接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表根据员工id进行匹配,找到后进行删除,否则返回
查询员工薪资信息模块
1)函数原形: void foundSalary(EMP* p1)
2) 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表根据员工id进行匹配,找到后进行信息修改,否则返回
保存信息模块
1)函数原形: void save()
2) 功能:创建一个文件,将链表中的信息保存到硬盘中
读取信息模块
- 函数原形: EMP* read1()
2) 功能:打开一个文件,将文件中的信息读取到内存中,并返回一个EMP类型的指针
主要功能模块流程图
三、设计题目源代码清单
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct employee
{
int id;//编号
char no; //职工号
char name[40]; //职工姓名
char sex[10]; //职工性别
int age; //职工年龄
int rand;//级别
int hour; //兼职小时
int num; //销售量
int slary;
struct employee* next;//下一结点指针
};
typedef struct employee EMP;
EMP* h;
int index = 1;
void menu()
{
printf(" Main Menu\n");
printf(" ********************** \n");
printf(" * 0:退出 1 :创建员工 \n");
printf(" * 2:查找员工 3 :提升员工等级 \n");
printf(" * 4:修改员工 5 :删除员工 \n");
printf(" * 6:查询员工薪资 \n");
printf(" * 7.保存 8.读取 \n");
printf(" ********************** \n");
}
EMP* creat(EMP* h)
{
EMP* cur = h;
if (cur == NULL)
{
EMP* tmp = (EMP*)malloc(sizeof(EMP));
if (tmp == NULL)
{
printf("erro\n");
return;
}
tmp->next = NULL;
tmp->id = index++;
printf("输入名称:");
scanf("%s", &tmp->name);
getchar();
printf("输入职工类型:");
printf("经理:a\t兼职技术人员:b\t销售经理:c\t兼职推销员:d\n");
scanf("%c", &tmp->no);
getchar();
if (tmp->no == 'a')
{
tmp->rand = 1;
tmp->slary = 10000;
}
if (tmp->no == 'b')
{
printf("输入工作小时:");
scanf("%d", &tmp->hour);
getchar();
printf("输入级别:");
scanf("%d", &tmp->rand);
getchar();
tmp->slary = tmp->hour * 10 * tmp->rand;
}
if (tmp->no == 'c')
{
printf("输入销售量:");
scanf("%d", &tmp->num);
getchar();
printf("输入级别:");
scanf("%d", &tmp->rand);
getchar();
tmp->slary = 5000 + tmp->num * 300 * tmp->rand;
}
if (tmp->no == 'd')
{
int num;
printf("输入销售量:");
scanf("%d", &tmp->num);
getchar();
printf("输入等级:");
scanf("%d", &tmp->rand);
getchar();
tmp->slary = 3000 + tmp->num * tmp->rand * 20;
}
printf("输入年龄:");
scanf("%d", &tmp->age);
getchar();
printf("输入性别:");
scanf("%s", &tmp->sex);
getchar();
return tmp;
}
else {
EMP* tmp = (EMP*)malloc(sizeof(EMP));
if (tmp == NULL)
{
printf("erro\n");
return;
}
tmp->next = NULL;
tmp->id = index++;
printf("输入名称:");
scanf("%s", &tmp->name);
getchar();
printf("输入职工类型:");
printf("经理:a\t兼职技术人员:b\t销售经理:c\t兼职推销员:d\n");
scanf("%c", &tmp->no);
getchar();
if (tmp->no == 'a')
{
tmp->rand = 1;
tmp->slary = 10000;
}
if (tmp->no == 'b')
{
printf("输入工作小时:");
scanf("%d", &tmp->hour);
getchar();
printf("输入级别:");
scanf("%d", &tmp->rand);
getchar();
tmp->slary = tmp->hour * 10 * tmp->rand;
}
if (tmp->no == 'c')
{
printf("输入销售量:");
scanf("%d", &tmp->num);
getchar();
printf("输入级别:");
scanf("%d", &tmp->rand);
getchar();
tmp->slary = 5000 + tmp->num * 300 * tmp->rand;
}
if (tmp->no == 'd')
{
int num;
printf("输入销售量:");
scanf("%d", &tmp->num);
getchar();
printf("输入等级:");
scanf("%d", &tmp->rand);
getchar();
tmp->slary = 3000 + tmp->num * tmp->rand * 20;
}
printf("输入年龄:");
scanf("%d", &tmp->age);
getchar();
printf("输入性别:");
scanf("%s", &tmp->sex);
getchar();
while (1)
{
if (cur->next == NULL)
{
cur->next = tmp;
return h;
}
cur = cur->next;
}
}
}
void promote(EMP* p1)
{
EMP* p = p1;
if (p == NULL)
{
printf("没有职工,请先创建职工!\n");
return;
}
printf("输入职工id:");
int id;
scanf("%d", &id);
getchar();
while (p != NULL)
{
if (p->id == id)
{
printf("在该工位上提升一个等级!\n");
p->rand++;
printf("按任意键继续\n");
getchar();
return;
}
p = p->next;
}
printf("没有找到该员工!\n");
}
void found(EMP* p1)
{
EMP* p = p1;
if (p == NULL)
{
printf("没有职工,请先创建职工!\n");
return;
}
printf("输入要查找的职工id:");
int id;
scanf("%d", &id);
getchar();
while (p != NULL)
{
if (p->id == id)
{
printf("%d\t%c\t%s\t%s\t%d\t%d\n", p->id, p->no, p->name, p->sex, p->age, p->rand);
printf("按任意键继续\n");
getchar();
return;
}
p = p->next;
}
printf("没有找到该员工!\n");
}
void Modi(EMP* p1)
{
EMP* p = p1;
if (p == NULL)
{
printf("没有职工,请先创建职工!\n");
return;
}
printf("输入要修改的职工id:");
int id;
scanf("%d", &id);
getchar();
while (p != NULL)
{
if (p->id == id)
{
printf("输入名称:");
scanf("%s", &p->name);
getchar();
printf("输入职工类型:");
printf("经理:a\t兼职技术人员:b\t销售经理:c\t兼职推销员:d\n");
scanf("%c", &p->no);
getchar();
if (p->no == 'a')
{
p->rand = 1;
p->slary = 10000;
}
if (p->no == 'b')
{
printf("输入工作小时:");
scanf("%d", &p->hour);
getchar();
printf("输入级别:");
scanf("%d", &p->rand);
getchar();
p->slary = p->hour * 10 * p->rand;
}
EMP* tmp = p;
if (tmp->no == 'c')
{
printf("输入销售量:");
scanf("%d", &tmp->num);
getchar();
printf("输入级别:");
scanf("%d", &tmp->rand);
getchar();
tmp->slary = 5000 + tmp->num * 300 * tmp->rand;
}
if (tmp->no == 'd')
{
int num;
printf("输入销售量:");
scanf("%d", &tmp->num);
getchar();
printf("输入等级:");
scanf("%d", &tmp->rand);
getchar();
tmp->slary = 3000 + tmp->num * tmp->rand * 20;
}
printf("输入年龄:");
scanf("%d", &tmp->age);
getchar();
printf("输入性别:");
scanf("%s", &tmp->sex);
getchar();
return;
}
p = p->next;
}
printf("没有找到该员工!\n");
}
EMP* delete(EMP* p1)
{
EMP* p = p1;
EMP* cur = p;
EMP* prev = p;
if (p == NULL)
{
printf("没有职工,请先创建职工!\n");
return;
}
printf("输入职工id:");
int id;
scanf("%d", &id);
getchar();
while (cur != NULL)
{
if (id == 1 && cur->next != NULL)
{
EMP* a = cur->next;
printf("删除成功!\n");
printf("按任意键继续\n");
getchar();
return a;
}
else if (id == 1 && cur->next == NULL)
{
printf("删除成功!\n");
printf("按任意键继续\n");
getchar();
return NULL;
}
if (cur->id == id)
{
prev->next = cur->next;
free(cur);
printf("删除成功!\n");
printf("按任意键继续\n");
getchar();
return p1;
}
prev = cur;
cur = cur->next;
}
printf("没有找到该员工!\n");
return p1;
}
void foundSalary(EMP* p1)
{
EMP* p = p1;
if (p == NULL)
{
printf("没有职工,请先创建职工!\n");
return;
}
printf("输入职工id:");
int id;
scanf("%d", &id);
getchar();
while (p != NULL)
{
if (p->id == id)
{
printf("该职工的薪资是:%d\n", p->slary);
printf("按任意键继续\n");
getchar();
return;
}
p = p->next;
}
}
void save()
{
FILE* fp;
EMP* pCur = h;
int iCount = 0;
if (pCur == NULL)
{
printf("\n没有学生记录!\n");
return;
}
if ((fp = fopen("EMP.txt", "wb")) == NULL)
{
printf("创建文件失败!\n");
getchar();
exit(1);
}
while (pCur)
{
fwrite(pCur, sizeof(EMP), 1, fp);
pCur = pCur->next;
iCount++;
}
printf("\n");
printf("保存文件的数据数目为:%d\n", iCount);
printf("按任意键返回!\n");
getchar();
fclose(fp);
}
EMP* read1()
{
FILE* fp;
EMP* pHead = NULL, * pTemp = NULL, * pCur = NULL;
if ((fp = fopen("EMP.txt", "r")) == NULL)
{
printf("\n文件打开失败!请检查文件名!\n");
printf("按任意键退出!");
getchar();
exit(0);
}
pTemp = (EMP*)malloc(sizeof(EMP));
while (fread(pTemp, sizeof(EMP), 1, fp))
{
if (!pHead)
{
pHead = pCur = pTemp;
}
else
{
pCur->next = pTemp;
pCur = pTemp;
}
pTemp = (EMP*)malloc(sizeof(EMP));
}
fclose(fp);
printf("读取成功!\n按任意键返回!\n");
getchar();
return pHead;
}
void main(void)
{
int op;
//h = (EMP*)malloc(sizeof(EMP)); //创建链表的头结点
//h->next = NULL; //初始化链表头节点中下一节点指针为NULL
menu();
scanf("%d", &op);
getchar();
while (1)
{
system("cls");
switch (op)
{
case 1:h = creat(h); break;
case 2:found(h); break;
case 3:promote(h); break;
case 4:Modi(h); break;
case 5:h = delete(h); break;
case 6:foundSalary(h); break;
case 7:save(); break;
case 8:h = read1(); break;
case 0:return 0; break;
}
menu();
scanf("%d", &op);
}
}
四、 测试用例
创建员工
查找员工
提升员工等级
修改员工信息
删除员工
查询员工薪资
保存
读取