From f33644ca43053f67570990fcd25e55eb8a632e67 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Tue, 21 Jul 2020 19:46:35 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/employee.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.cpp | 401 ---------------------------------------------- 1 file changed, 401 deletions(-) delete mode 100644 code/employee.cpp diff --git a/code/employee.cpp b/code/employee.cpp deleted file mode 100644 index 0c39479..0000000 --- a/code/employee.cpp +++ /dev/null @@ -1,401 +0,0 @@ -#include -#include -#include -#include -#include -#include "employee.h" -using namespace std; - -__declspec(selectany) sales_Records all;//总销售记录头指针 -employee_list employee_List = employee_makeEmpty(); - -employee::employee() -{ - // 将结构体中所有成员都置为空 - id = 0; - memset(name, 0, sizeof(name)); - memset(sex, 0, sizeof(sex)); - memset(phone, 0, sizeof(phone)); - basic_salary = 0; - absentDays = 0; - salary = 0; - old_price = 0; - memset(department, 0, sizeof(department)); - memset(job, 0, sizeof(job)); - pre = NULL; - next = NULL; -} - -// 员工信息管理菜单 -void employee_meau() -{ - employee_list p; - bool flag; - int num; - while(true) - { - system("cls"); - printf("欢迎使用员工信息管理!\n"); - printf("*******请输入要执行的功能:*******\n"); - printf("****** 1----增加员工信息 *********\n"); - printf("****** 2----查找员工信息 *********\n"); - printf("****** 3----删除员工信息 *********\n"); - printf("****** 4----统计员工工资 *********\n"); - printf("****** 5----员工考勤管理 *********\n"); - printf("********* 0----退出系统 **********\n"); - scanf("%d", &num); getchar(); - fflush(stdin); - system("cls"); - switch(num) - { - case 0:return; - case 1: - { - int n; - printf("1--从文件读取 2--手动添加\n请选择:"); - scanf("%d", &n); - fflush(stdin); - if(n == 1) - { - employee_inputFromFile(employee_List); - } - else - { - employee_List = employee_addNode(employee_List); - } - break; - } - case 2: - { - employee_find(employee_List); - system("pause"); - break; - } - case 3: - { - flag = employee_deleteNode(employee_List); - if(flag == true) - { - printf("删除成功。\n"); - } - else - { - printf("未找到相关信息,请重试。\n"); - } - system("pause"); - break; - } - case 4: - { - if(employee_countSalary(employee_List, all) == 1) - { - employee_printIntoFile(employee_List); - } - break; - } - case 5: - { - bool flag1 = employee_modifyAbsentDays(employee_List); - if(flag1 == true) - { - printf("修改成功!\n"); - } - else - { - printf("未找到相关信息,请重试。\n"); - } - system("pause"); - } - } - } - return; -} - -// 创建并返回一个空的带头结点的双向链表 -employee_list employee_makeEmpty() -{ - employee_list head = new employee; - return head; -} - -// 查找功能 1--ID查找 2--姓名查找 -void employee_find(employee_list head) -{ - int id; - int num; - printf("1--ID查找 2--姓名查找\n"); - employee_list p; - char name[30]; - scanf("%d", &num); - if(num == 1) - { - printf("请输入工号:\n"); - scanf("%d", &id); - p = employee_findId(head, id); - } - else if(num == 2) - { - printf("请输入姓名:\n"); - scanf("%s", name); - p = employee_findName(head, name); - } - else - { - printf("输入错误!\n"); - return; - } - if(p != NULL) - { - printf("姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n缺勤天数:%d\n部门:%s\n职务:%s\n", - p->name, p->id, p->sex, p->phone, p->basic_salary, p->absentDays, p->department, p->job); - } - else - { - printf("未找到相关信息,请重试。\n"); - } - return; -} - -// 工号的精确查找,返回表中id的位置,若找不到则返回NULL -employee_list employee_findId(employee_list listHead, int value) -{ - employee_list p = listHead; - while(p != NULL) - { - if(p->id == value) - break; - p = p->next; - } - return p; -} - -// 姓名的精确查找,返回表中name的位置,若找不到则返回NULL -employee_list employee_findName(employee_list listHead, char value[]) -{ - employee_list p = listHead; - while(p != NULL) - { - if(strcmp(p->name, value) == 0) - break; - p = p->next; - } - return p; -} - -// 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false -bool employee_insertNode(employee_list position) -{ - if(position == NULL) // position指向非法位置 - { - return false; - } - employee *s = new employee; - char str[30]; - int s1; - printf("员工姓名:\n"); - scanf("%s", str); - strcpy(s->name, str); - printf("员工工号:\n"); - scanf("%d", &s1); - s->id = s1; - printf("员工性别:\n"); - scanf("%s", str); - strcpy(s->sex, str); - printf("员工电话:\n"); - scanf("%s", str); - printf("基本工资:\n"); - scanf("%d", &s1); - s->basic_salary = s1; - strcpy(s->phone, str); - printf("所在部门:\n"); - scanf("%s", str); - strcpy(s->department, str); - printf("职务:\n"); - scanf("%s", str); - strcpy(s->job, str); - s->absentDays = 0; - s->salary = 0; - s->next = position->next; // 修改新增结点后继指针 - position->next = s; // 修改position的后继指针 - if(s->next != NULL) // s不是链表尾节点 - s->next->pre = s; // 修改新增结点下一结点的前驱指针 - s->pre = position; // 修改新增结点前驱指针 - printf("添加信息成功。\n"); - //system("pause"); - return true; -} - -// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 -employee_list employee_addNode(employee_list listHead) -{ - employee_insertNode(listHead); - return listHead; -} - -// 将position指向的元素删除并返回true。若position指向非法位置,返回false -bool employee_deleteNode(employee_list listHead) -{ - int id; - printf("请输入工号:"); - scanf("%d", &id); - employee_list p = listHead, q = listHead->next; - while(q != NULL) - { - if(q->id == id) - { - p->next = q->next; - delete q; - return true; - } - p = p->next; - q = q->next; - } - return false; -} - -// 从文件读入已有信息 -bool employee_inputFromFile(employee_list listHead) -{ - FILE *fp = fopen("employee_info.txt", "r"); - if(fp == NULL) // 未打开成功 - { - puts("无法打开指定的文件,请重试。"); - system("pause"); - return false; - } - char temp[500]; // 假定一条数据的最大长度为500个字符 - int cnt = 0; // 记录读入数据条数 - while(!feof(fp)) - { - employee_list s = (employee *)malloc(sizeof(employee)); - fscanf(fp, "%d %s %s %s %d %d %s %s", - &s->id, s->name, s->sex, s->phone, - &s->basic_salary, &s->absentDays, - s->department, s->job); - s->salary = 0; - s->old_price = 0; - s->next = listHead->next; - listHead->next = s; - cnt++; - } - if(cnt != 0) - { - printf("成功读入 %d 条数据。\n", cnt); - } - else - { - printf("未能成功读取数据,请检查文件是否为空。\n"); - } - fclose(fp); - system("pause"); - return true; -} - -// 计算并打印员工工资 -int employee_countSalary(employee_list listHead, sales_Records re) -{ - employee_list p = listHead->next; - if(p == NULL) - { - puts("\n当前系统中暂无记录,请输入信息后再尝试保存\n"); - system("pause"); - return 0; - } - sales_Records q = NULL; - char input; - bool flag; - printf("%-15s %-4s %-4s %-12s %-8s %-8s %-8s %-20s %s\n", - "姓名", "工号", "性别", "电话", "基本工资", "工资", "缺勤天数", "部门", "职务"); - while(p != NULL) - { - if(re != NULL) - { - q = re->next; - } - double price = 0; - p->salary = p->basic_salary; - if(p->absentDays > 0) - { - p->salary -= p->absentDays * 50.0; // 计算缺勤天数应该扣的钱 - } - while(q != NULL) - { - if(strcmp(p->name, q->people) == 0) - { - price += q->price; - } - q = q->next; - } - if(price > 0) - { - p->salary += (price - p->old_price) * 0.05; // 提成销售额的5% - p->old_price += price; - } - printf("%-15s %-4d %-4s %-12s %-8d %-8.2lf %-8d %-20s %s\n", - p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); - p = p->next; - } - printf("是否将员工信息输出到文件?(y/n)"); - fflush(stdin); - scanf("%c", &input); - if(input == 'y') - { - return 1; - } - else - { - return 0; - } -} - -// 将员工信息输出到文件 -void employee_printIntoFile(employee_list listHead) -{ - employee_list p = listHead->next; - if(p == NULL) - { - puts("\n当前系统中暂无记录,请输入信息后再尝试保存\n"); - system("pause"); - return; - } - FILE *fp = fopen("employ.txt", "w"); - if(fp == NULL) - { - puts("无法打开指定文件。"); - system("pause"); - return; - } - int num = 0; - while(p != NULL) - { - fprintf(fp, "姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n工资:%.2lf\n缺勤天数:%d\n部门:%s\n职务:%s\n\n", - p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); - p = p->next; - num++; - } - printf("成功保存%d条数据到employ.txt中。\n", num); - fclose(fp); - system("pause"); -} - -// 员工考勤管理 -bool employee_modifyAbsentDays(employee_list listHead) -{ - int id, day; - puts("请输入工号:"); - scanf("%d", &id); - employee_list p = employee_findId(listHead, id); - if(p == NULL) - { - return false; - } - else - { - printf("员工姓名:%s\n工号:%d\n当前缺勤天数:%d\n", - p->name, p->id, p->absentDays); - printf("请输入修改后缺勤天数:"); - scanf("%d", &day); - p->absentDays = day; - return true; - } -} \ No newline at end of file -- Gitee From ef66382b16330609dbffd74589c19909ad12f66e Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Tue, 21 Jul 2020 19:46:53 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/employee.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.h | 68 ------------------------------------------------- 1 file changed, 68 deletions(-) delete mode 100644 code/employee.h diff --git a/code/employee.h b/code/employee.h deleted file mode 100644 index 7cc304a..0000000 --- a/code/employee.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef __EMPLOYEE_H__ -#define __EMPLOYEE_H__ - -// 标准头文件结构 - -#include "sell.h" - -// 员工信息结点的数据结构(双向链表) -struct employee { - int id; // 工号 - char name[15]; // 姓名 - char sex[5]; // 性别 - char phone[15]; // 电话 - int basic_salary; // 基本工资 - double salary; //工资 - double old_price; // 历史销售额 - int absentDays; // 缺勤的天数 - char department[20]; // 部门 - char job[20]; // 职务 - struct employee *pre; // 前趋指针 - struct employee *next; // 后继指针 - employee(); // 构造函数,用于新建结点时初始化内容 -}; - -typedef employee *employee_list; -typedef records *sales_Records; -// employee_list 就相当于 employee* - -// 创建并返回一个空的带头结点的双向链表 -employee_list employee_makeEmpty(); - -// 工号的精确查找,返回表中id的位置,若找不到则返回NULL -employee_list employee_findId(employee_list listHead, int value); - -// 姓名的精确查找,返回表中name的位置,若找不到则返回NULL -employee_list employee_findName(employee_list listHead, char value[]); - -// 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false -bool employee_insertNode(employee_list position); - -// 将position指向的元素删除并返回true。若position指向非法位置,返回false -bool employee_deleteNode(employee_list position); - -// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 -employee_list employee_addNode(employee_list listHead); - -// 释放链表所占空间(释放全部结点) -void employee_deleteLinkList(employee_list listHead); - -// 从文件读入已有信息 -bool employee_inputFromFile(employee_list listHead); - -// 计算并打印员工工资 -int employee_countSalary(employee_list listHead, sales_Records re); - -// 将员工信息输出到文件 -void employee_printIntoFile(employee_list listHead); - -// 查找功能 1--ID查找 2--姓名查找 -void employee_find(employee_list head); - -// 员工管理模块菜单 -void employee_meau(); - -// 员工考勤管理 -bool employee_modifyAbsentDays(employee_list listHead); - -#endif -- Gitee From 9472c31b39c1a3c295b43436a443379a9a15e05f Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Tue, 21 Jul 2020 19:47:08 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/employee=5Finfo.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee_info.txt | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 code/employee_info.txt diff --git a/code/employee_info.txt b/code/employee_info.txt deleted file mode 100644 index 3589bed..0000000 --- a/code/employee_info.txt +++ /dev/null @@ -1,5 +0,0 @@ -101 zhangsan M 13122220000 3000 5 SalesDepartment salesperson -102 lisi M 13255555555 3500 1 SalesDepartment salesperson -103 wangwu F 13333333333 3200 2 Division assistant -104 xiaohong M 13255888855 4500 0 SalesDepartment salesperson -105 xiaoming F 13333330000 2200 0 Division assistant \ No newline at end of file -- Gitee From 17625578bb54c953aeb03ca60ba10af7a60b204d Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Tue, 21 Jul 2020 21:43:10 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E5=91=98=E5=B7=A5=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=BB=A3=E7=A0=81=E5=AE=A1=E6=9F=A5=E5=90=8E?= =?UTF-8?q?=E4=BF=AE=E6=94=B91.0=20employee=5Finfo1=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E7=AC=AC=E5=91=98=E5=B7=A5=E4=BF=A1=E6=81=AF=EF=BC=8C=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E7=B3=BB=E7=BB=9F=E5=90=AF=E5=8A=A8=E6=97=B6=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=20employee=5Finfo=E5=AD=98=E5=82=A8=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=B7=A5=E8=B5=84=E5=90=8E=E7=9A=84=E5=91=98=E5=B7=A5=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E6=96=B9=E4=BE=BF=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.cpp | 546 ++++++++++++++++++++++++++++++++++++++++ code/employee.h | 70 ++++++ code/employee_info.txt | 5 + code/employee_info1.txt | 15 ++ 4 files changed, 636 insertions(+) create mode 100644 code/employee.cpp create mode 100644 code/employee.h create mode 100644 code/employee_info.txt create mode 100644 code/employee_info1.txt diff --git a/code/employee.cpp b/code/employee.cpp new file mode 100644 index 0000000..33b1e13 --- /dev/null +++ b/code/employee.cpp @@ -0,0 +1,546 @@ +#include +#include +#include +#include +#include "employee.h" +using namespace std; + +__declspec(selectany) sales_Records all;//总销售记录头指针 + + +employee::employee() +{ + // 将结构体中所有成员都置为空 + id = 0; + memset(name, 0, sizeof(name)); + memset(sex, 0, sizeof(sex)); + memset(phone, 0, sizeof(phone)); + basic_salary = 0; + absentDays = 0; + salary = 0; + old_price = 0; + memset(department, 0, sizeof(department)); + memset(job, 0, sizeof(job)); + pre = NULL; + next = NULL; +} + + +// 员工信息管理菜单 +// 无参数 +// 无返回值 +void employee_meau() +{ + employee_list employee_List = employee_makeEmpty(); // 员工信息链表 + bool employee_flag = employee_inputFromFile1(employee_List); + employee_list p; + bool flag; + int num; //操作数 + while (true) + { + system("cls"); + printf("欢迎使用员工信息管理!\n"); + printf("*******请输入要执行的功能:*******\n"); + printf("****** 1----增加员工信息 *********\n"); + printf("****** 2----查找员工信息 *********\n"); + printf("****** 3----删除员工信息 *********\n"); + printf("****** 4----统计员工工资 *********\n"); + printf("****** 5----员工考勤管理 *********\n"); + printf("********* 0----退出系统 **********\n"); + scanf("%d", &num); getchar(); + fflush(stdin); + system("cls"); + switch (num) + { + case 0: + { + flag = employee_printIntoFile1(employee_List); + return; //退出系统 + } + case 1: //添加员工信息 + { + int n; + printf("1--从文件读取 2--手动添加\n请选择:"); + scanf("%d", &n); + fflush(stdin); + if (n == 1) //文件读取 + { + employee_inputFromFile(employee_List); + } + else if (n == 2) + { + employee *s = new employee; //新增信息节点 + char str[30]; + int s1; + printf("员工姓名:\n"); + scanf("%s", str); + strcpy(s->name, str); + printf("员工工号:\n"); + scanf("%d", &s1); + s->id = s1; + printf("员工性别:\n"); + scanf("%s", str); + strcpy(s->sex, str); + printf("员工电话:\n"); + scanf("%s", str); + printf("基本工资:\n"); + scanf("%d", &s1); + s->basic_salary = s1; + strcpy(s->phone, str); + printf("所在部门:\n"); + scanf("%s", str); + strcpy(s->department, str); + printf("职务:\n"); + scanf("%s", str); + strcpy(s->job, str); + s->absentDays = 0; + s->salary = 0; + employee_List = employee_addNode(employee_List, s); //插入到链表中 + } + else + { + printf("输入错误!\n"); + break; + } + flag = employee_printIntoFile1(employee_List); + system("pause"); + break; + } + case 2: //查找员工信息 + { + if (employee_List->next == NULL) //判断系统内是否存在员工信息 + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + employee_find(employee_List); // 查找函数 + system("pause"); + break; + } + case 3: //删除员工信息 + { + if (employee_List->next == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + int id; //待删除员工工号 + printf("请输入工号:"); + scanf("%d", &id); + flag = employee_deleteNode(employee_List, id); //调用删除信息函数 + if (flag == true) + { + printf("删除成功。\n"); + } + else + { + printf("未找到相关信息,请重试。\n"); + } + flag = employee_printIntoFile1(employee_List); + system("pause"); + break; + } + case 4: //统计员工工资 + { + if (employee_List == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + char input; + bool flag; + flag = employee_countSalary(employee_List, all); //统计函数 + bool flag2 = employee_printIntoFile1(employee_List); + printf("是否将员工信息输出到文件?(y/n)"); + fflush(stdin); + scanf("%c", &input); + if (input == 'y') + { + bool f = employee_printIntoFile(employee_List); + } + else + { + break; + } + break; + } + case 5: //考勤管理 + { + if (employee_List->next == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + bool flag1 = employee_modifyAbsentDays(employee_List); // 修改函数 + if (flag1 == true) + { + printf("修改成功!\n"); + flag = employee_printIntoFile1(employee_List); + } + else + { + printf("未找到相关信息,请重试。\n"); + } + system("pause"); + break; + } + default: //输出错误 + { + printf("输入错误!\n"); + system("pause"); + } + } + } + employee_deleteLinkList(employee_List); +} + +// 创建并返回一个空的带头结点的双向链表 +// 无参数 +// 返回链表头结点 +employee_list employee_makeEmpty() +{ + employee_list head = new employee; //头结点定义并分配空间 + head->next = NULL; + return head; +} + +// 查找功能 1--ID查找 2--姓名查找 +// 参数:员工信息链表头结点 +// 返回值:无 +void employee_find(employee_list head) +{ + int id; //待查找工号 + int num; + printf("1--ID查找 2--姓名查找\n"); + employee_list p; + char name[30]; //待查找姓名 + scanf("%d", &num); // 查找类型 + if (num == 1) + { + printf("请输入工号:\n"); + scanf("%d", &id); + p = employee_findId(head, id); //ID查找 + } + else if (num == 2) + { + printf("请输入姓名:\n"); + scanf("%s", name); + p = employee_findName(head, name); // 姓名查找 + } + else + { + printf("输入错误!\n"); + return; + } + if (p != NULL) //存在则输出相应的信息 + { + printf("姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n缺勤天数:%d\n部门:%s\n职务:%s\n", + p->name, p->id, p->sex, p->phone, p->basic_salary, p->absentDays, p->department, p->job); + } + else //不存在输出提示信息 + { + printf("未找到相关信息,请重试。\n"); + } + return; +} + +// 工号的精确查找,返回表中id的位置,若找不到则返回NULL +// 参数:1.员工信息链表头结点 2.待查找工号 +// 返回:对应节点 +employee_list employee_findId(employee_list listHead, int value) +{ + employee_list p = listHead; + while (p != NULL) //遍历链表 + { + if (p->id == value) + { + break; + } + p = p->next; + } + return p; //返回对应节点 +} + +// 姓名的精确查找,返回表中name的位置,若找不到则返回NULL +// 参数:1.员工信息链表头结点 2.待查找姓名 +// 返回值:对应节点 +employee_list employee_findName(employee_list listHead, char value[]) +{ + employee_list p = listHead; + while (p != NULL) //遍历链表 + { + if (strcmp(p->name, value) == 0) + { + break; + } + p = p->next; + } + return p; +} + +// 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false +// 参数:1.待插入位置 2.节点 +// 返回值:true/false +bool employee_insertNode(employee_list position, employee * s) +{ + if (s == NULL) //判断信息节点是否为空 + { + printf("添加信息失败!\n"); + return false; + } + if (position == NULL) // position指向非法位置 + { + printf("添加信息失败!\n"); + return false; + } + s->next = position->next; // 修改新增结点后继指针 + position->next = s; // 修改position的后继指针 + if (s->next != NULL) // s不是链表尾节点 + s->next->pre = s; // 修改新增结点下一结点的前驱指针 + s->pre = position; // 修改新增结点前驱指针 + printf("添加信息成功。\n"); + return true; +} + +// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 +// 参数:1.待插入位置 2.节点 +// 返回值:链表头结点 +employee_list employee_addNode(employee_list listHead, employee *s) +{ + bool flag = employee_insertNode(listHead, s); //调用插入函数 + return listHead; +} + +// 将position指向的元素删除并返回true。若position指向非法位置,返回false +// 参数:1.员工信息链表 2.工号 +// 返回值:true/False +bool employee_deleteNode(employee_list listHead, int id) +{ + employee_list p = listHead, q = listHead->next; + while (q != NULL) //遍历链表 + { + if (q->id == id) + { + p->next = q->next; + delete q; // 找到了,删除该节点 + return true; + } + p = p->next; + q = q->next; + } + return false; //没找到 +} + +// 从文件读入已有信息 +// 参数:链表头结点 +// 返回值:true/false +bool employee_inputFromFile(employee_list listHead) +{ + FILE *fp = fopen("employee_info.txt", "r"); + if (fp == NULL) // 未打开成功 + { + puts("无法打开指定的文件,请重试。"); + system("pause"); + return false; + } + char temp[500]; // 假定一条数据的最大长度为500个字符 + int cnt = 0; // 记录读入数据条数 + while (!feof(fp)) + { + employee_list s = (employee *)malloc(sizeof(employee)); + fscanf(fp, "%d %s %s %s %d %lf %d %s %s", //读入信息 + &s->id, s->name, s->sex, s->phone, + &s->basic_salary, &s->salary, &s->absentDays, + s->department, s->job); + s->old_price = 0; + s->next = listHead->next; + listHead->next = s; + cnt++; + } + if (cnt != 0) + { + printf("成功读入 %d 条数据。\n", cnt); + } + else + { + printf("未能成功读取数据,请检查文件是否为空。\n"); + } + fclose(fp); + return true; +} + +bool employee_inputFromFile1(employee_list listHead) +{ + FILE *fp = fopen("employee_info1.txt", "r"); + if (fp == NULL) // 未打开成功 + { + puts("无法打开指定的文件,请重试。"); + system("pause"); + return false; + } + char temp[500]; // 假定一条数据的最大长度为500个字符 + int cnt = 0; // 记录读入数据条数 + while (!feof(fp)) + { + employee_list s = new employee; + /* + int id; + char name[15]; + char sex[5]; + char phone[15]; + int basic_salary; + double salary; + int absentDays; + char department[20]; + char job[20]; + fscanf(fp, "%d %s %s %s %d %lf %d %s %s", + &id, name, sex, phone, + &basic_salary, &salary, &absentDays, + department, job); + */ + fscanf(fp, "%d %s %s %s %d %lf %d %s %s\n", + &s->id, s->name, s->sex, s->phone, + &s->basic_salary, &s->salary, &s->absentDays, + s->department, s->job); + s->old_price = 0; + s->next = listHead->next; + listHead->next = s; + cnt++; + } + fclose(fp); + return true; +} + +// 计算并打印员工工资 +// 参数:员工信息链表 销售记录 +// 返回值:true/false +bool employee_countSalary(employee_list listHead, sales_Records re) +{ + employee_list p = listHead->next; + sales_Records q = NULL; + bool flag; + printf("%-15s %-4s %-4s %-12s %-8s %-8s %-8s %-20s %s\n", //输出提示信息 + "姓名", "工号", "性别", "电话", "基本工资", "工资", "缺勤天数", "部门", "职务"); + while (p != NULL) //遍历员工信息链表 + { + if (re != NULL) //销售记录链表不为空 + { + q = re->next; + } + double price = 0; + p->salary = p->basic_salary; //初始化员工工资 + if (p->absentDays > 0) + { + p->salary -= p->absentDays * 50.0; // 计算缺勤天数应该扣的钱 + } + while (q != NULL) //遍历销售记录 + { + if (strcmp(p->name, q->people) == 0) + { + price += q->price; + } + q = q->next; + } + if (price >= 0) + { + p->salary += (price - p->old_price) * 0.05; // 提成销售额的5% + p->old_price += price; + } + printf("%-15s %-4d %-4s %-12s %-8d %-8.2lf %-8d %-20s %s\n", //输出信息 + p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); + p = p->next; + + } + return true; +} + +// 将员工信息输出到文件 +// 参数:员工信息链表 +bool employee_printIntoFile(employee_list listHead) +{ + employee_list p = listHead->next; + FILE *fp = fopen("employ.txt", "w"); //打开文件 + if (fp == NULL) + { + puts("无法打开指定文件。"); + system("pause"); + return false; + } + int num = 0; + while (p != NULL) //将员工信息输出到文件 + { + fprintf(fp, "姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n工资:%.2lf\n缺勤天数:%d\n部门:%s\n职务:%s\n\n", + p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); + p = p->next; + num++; + } + printf("成功保存%d条数据到employ.txt中。\n", num); //提示信息 + fclose(fp); + system("pause"); + return true; +} + +bool employee_printIntoFile1(employee_list listHead) +{ + employee_list p = listHead->next; + FILE *fp = fopen("employee_info1.txt", "w"); //打开文件 + if (fp == NULL) + { + puts("无法打开指定文件。"); + system("pause"); + return false; + } + int num = 0; + while (p != NULL) //将员工信息输出到文件 + { + fprintf(fp, "%d %s %s %s %d %.2lf %d %s %s\n", + p->id, p->name, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); + p = p->next; + num++; + } + printf("成功保存%d条数据到employ_info1.txt中。\n", num); //提示信息 + fclose(fp); + return true; +} + + +//员工考勤管理 +//参数:员工信息链表头结点 +//返回值:true/false +bool employee_modifyAbsentDays(employee_list listHead) +{ + int id, day; + puts("请输入工号:"); + scanf("%d", &id); + employee_list p = employee_findId(listHead, id); //查找对应员工,返回相应节点 + if (p == NULL) + { + return false; + } + else + { + printf("员工姓名:%s\n工号:%d\n当前缺勤天数:%d\n", //输出修改前信息 + p->name, p->id, p->absentDays); + printf("请输入修改后缺勤天数:"); + scanf("%d", &day); + p->absentDays = day; //修改缺勤天数 + return true; + } +} + +// 释放链表所占空间(释放全部结点) +void employee_deleteLinkList(employee_list listHead) +{ + employee_list p = listHead; + while (p->next != NULL) // 依次释放链表结点所占空间 + { + p = p->next; + delete p->pre; + } + delete p; + return; +} diff --git a/code/employee.h b/code/employee.h new file mode 100644 index 0000000..cf32a78 --- /dev/null +++ b/code/employee.h @@ -0,0 +1,70 @@ +#ifndef __EMPLOYEE_H__ +#define __EMPLOYEE_H__ + +// 标准头文件结构 + +#include "sell.h" + +// 员工信息结点的数据结构(双向链表) +struct employee { + int id; // 工号 + char name[15]; // 姓名 + char sex[5]; // 性别 + char phone[15]; // 电话 + int basic_salary; // 基本工资 + double salary; //工资 + double old_price; // 历史销售额 + int absentDays; // 缺勤的天数 + char department[20]; // 部门 + char job[20]; // 职务 + struct employee *pre; // 前趋指针 + struct employee *next; // 后继指针 + employee(); // 构造函数,用于新建结点时初始化内容 +}; + +typedef employee *employee_list; +typedef records *sales_Records; +// employee_list 就相当于 employee* + +// 创建并返回一个空的带头结点的双向链表 +employee_list employee_makeEmpty(); + +// 工号的精确查找,返回表中id的位置,若找不到则返回NULL +employee_list employee_findId(employee_list listHead, int value); + +// 姓名的精确查找,返回表中name的位置,若找不到则返回NULL +employee_list employee_findName(employee_list listHead, char value[]); + +// 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false +bool employee_insertNode(employee_list position, employee* s); + +// 将position指向的元素删除并返回true。若position指向非法位置,返回false +bool employee_deleteNode(employee_list position,int id); + +// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 +employee_list employee_addNode(employee_list listHead, employee *s); + +// 释放链表所占空间(释放全部结点) +void employee_deleteLinkList(employee_list listHead); + +// 从文件读入已有信息 +bool employee_inputFromFile(employee_list listHead); +bool employee_inputFromFile1(employee_list listHead); + +// 计算并打印员工工资 +bool employee_countSalary(employee_list listHead, sales_Records re); + +// 将员工信息输出到文件 +bool employee_printIntoFile(employee_list listHead); + +bool employee_printIntoFile1(employee_list listHead); + +// 查找功能 1--ID查找 2--姓名查找 +void employee_find(employee_list head); + +// 员工管理模块菜单 +void employee_meau(); + +// 员工考勤管理 +bool employee_modifyAbsentDays(employee_list listHead); +#endif diff --git a/code/employee_info.txt b/code/employee_info.txt new file mode 100644 index 0000000..b46d226 --- /dev/null +++ b/code/employee_info.txt @@ -0,0 +1,5 @@ +111 zhangsan M 13122220000 3000 3000 5 SalesDepartment salesperson +112 lisi M 13255555555 3500 3500 1 SalesDepartment salesperson +113 wangwu F 13333333333 3200 3200 2 Division assistant +114 xiaohong M 13255888855 4500 4500 0 SalesDepartment salesperson +115 xiaoming F 13333330000 2200 2200 0 Division assistant \ No newline at end of file diff --git a/code/employee_info1.txt b/code/employee_info1.txt new file mode 100644 index 0000000..d7b8ae5 --- /dev/null +++ b/code/employee_info1.txt @@ -0,0 +1,15 @@ +110 xiaomong F 13333330000 2200 2200.00 0 Division assistant +109 xiaozhong M 13255888855 4500 4500.00 0 SalesDepartment salesperson +108 wangliu F 13333333333 3200 3100.00 2 Division assistant +107 lisan M 13255555555 3500 3450.00 1 SalesDepartment salesperson +106 zhangsi M 13122220000 3000 2750.00 5 SalesDepartment salesperson +105 xiaoming F 13333330000 2200 2200.00 0 Division assistant +104 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson +103 wangwu F 13333333333 3200 3100.00 2 Division assistant +102 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson +101 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson +111 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson +112 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson +113 wangwu F 13333333333 3200 3100.00 2 Division assistant +114 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson +115 xiaoming F 13333330000 2200 1950.00 5 Division assistant -- Gitee From 18cf6032cc9f0035c9b014f8c8787d6bdc68c8b8 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Tue, 21 Jul 2020 22:42:41 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/employee.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.cpp | 546 ---------------------------------------------- 1 file changed, 546 deletions(-) delete mode 100644 code/employee.cpp diff --git a/code/employee.cpp b/code/employee.cpp deleted file mode 100644 index 33b1e13..0000000 --- a/code/employee.cpp +++ /dev/null @@ -1,546 +0,0 @@ -#include -#include -#include -#include -#include "employee.h" -using namespace std; - -__declspec(selectany) sales_Records all;//总销售记录头指针 - - -employee::employee() -{ - // 将结构体中所有成员都置为空 - id = 0; - memset(name, 0, sizeof(name)); - memset(sex, 0, sizeof(sex)); - memset(phone, 0, sizeof(phone)); - basic_salary = 0; - absentDays = 0; - salary = 0; - old_price = 0; - memset(department, 0, sizeof(department)); - memset(job, 0, sizeof(job)); - pre = NULL; - next = NULL; -} - - -// 员工信息管理菜单 -// 无参数 -// 无返回值 -void employee_meau() -{ - employee_list employee_List = employee_makeEmpty(); // 员工信息链表 - bool employee_flag = employee_inputFromFile1(employee_List); - employee_list p; - bool flag; - int num; //操作数 - while (true) - { - system("cls"); - printf("欢迎使用员工信息管理!\n"); - printf("*******请输入要执行的功能:*******\n"); - printf("****** 1----增加员工信息 *********\n"); - printf("****** 2----查找员工信息 *********\n"); - printf("****** 3----删除员工信息 *********\n"); - printf("****** 4----统计员工工资 *********\n"); - printf("****** 5----员工考勤管理 *********\n"); - printf("********* 0----退出系统 **********\n"); - scanf("%d", &num); getchar(); - fflush(stdin); - system("cls"); - switch (num) - { - case 0: - { - flag = employee_printIntoFile1(employee_List); - return; //退出系统 - } - case 1: //添加员工信息 - { - int n; - printf("1--从文件读取 2--手动添加\n请选择:"); - scanf("%d", &n); - fflush(stdin); - if (n == 1) //文件读取 - { - employee_inputFromFile(employee_List); - } - else if (n == 2) - { - employee *s = new employee; //新增信息节点 - char str[30]; - int s1; - printf("员工姓名:\n"); - scanf("%s", str); - strcpy(s->name, str); - printf("员工工号:\n"); - scanf("%d", &s1); - s->id = s1; - printf("员工性别:\n"); - scanf("%s", str); - strcpy(s->sex, str); - printf("员工电话:\n"); - scanf("%s", str); - printf("基本工资:\n"); - scanf("%d", &s1); - s->basic_salary = s1; - strcpy(s->phone, str); - printf("所在部门:\n"); - scanf("%s", str); - strcpy(s->department, str); - printf("职务:\n"); - scanf("%s", str); - strcpy(s->job, str); - s->absentDays = 0; - s->salary = 0; - employee_List = employee_addNode(employee_List, s); //插入到链表中 - } - else - { - printf("输入错误!\n"); - break; - } - flag = employee_printIntoFile1(employee_List); - system("pause"); - break; - } - case 2: //查找员工信息 - { - if (employee_List->next == NULL) //判断系统内是否存在员工信息 - { - printf("系统内暂无员工信息!\n"); - system("pause"); - break; - } - employee_find(employee_List); // 查找函数 - system("pause"); - break; - } - case 3: //删除员工信息 - { - if (employee_List->next == NULL) - { - printf("系统内暂无员工信息!\n"); - system("pause"); - break; - } - int id; //待删除员工工号 - printf("请输入工号:"); - scanf("%d", &id); - flag = employee_deleteNode(employee_List, id); //调用删除信息函数 - if (flag == true) - { - printf("删除成功。\n"); - } - else - { - printf("未找到相关信息,请重试。\n"); - } - flag = employee_printIntoFile1(employee_List); - system("pause"); - break; - } - case 4: //统计员工工资 - { - if (employee_List == NULL) - { - printf("系统内暂无员工信息!\n"); - system("pause"); - break; - } - char input; - bool flag; - flag = employee_countSalary(employee_List, all); //统计函数 - bool flag2 = employee_printIntoFile1(employee_List); - printf("是否将员工信息输出到文件?(y/n)"); - fflush(stdin); - scanf("%c", &input); - if (input == 'y') - { - bool f = employee_printIntoFile(employee_List); - } - else - { - break; - } - break; - } - case 5: //考勤管理 - { - if (employee_List->next == NULL) - { - printf("系统内暂无员工信息!\n"); - system("pause"); - break; - } - bool flag1 = employee_modifyAbsentDays(employee_List); // 修改函数 - if (flag1 == true) - { - printf("修改成功!\n"); - flag = employee_printIntoFile1(employee_List); - } - else - { - printf("未找到相关信息,请重试。\n"); - } - system("pause"); - break; - } - default: //输出错误 - { - printf("输入错误!\n"); - system("pause"); - } - } - } - employee_deleteLinkList(employee_List); -} - -// 创建并返回一个空的带头结点的双向链表 -// 无参数 -// 返回链表头结点 -employee_list employee_makeEmpty() -{ - employee_list head = new employee; //头结点定义并分配空间 - head->next = NULL; - return head; -} - -// 查找功能 1--ID查找 2--姓名查找 -// 参数:员工信息链表头结点 -// 返回值:无 -void employee_find(employee_list head) -{ - int id; //待查找工号 - int num; - printf("1--ID查找 2--姓名查找\n"); - employee_list p; - char name[30]; //待查找姓名 - scanf("%d", &num); // 查找类型 - if (num == 1) - { - printf("请输入工号:\n"); - scanf("%d", &id); - p = employee_findId(head, id); //ID查找 - } - else if (num == 2) - { - printf("请输入姓名:\n"); - scanf("%s", name); - p = employee_findName(head, name); // 姓名查找 - } - else - { - printf("输入错误!\n"); - return; - } - if (p != NULL) //存在则输出相应的信息 - { - printf("姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n缺勤天数:%d\n部门:%s\n职务:%s\n", - p->name, p->id, p->sex, p->phone, p->basic_salary, p->absentDays, p->department, p->job); - } - else //不存在输出提示信息 - { - printf("未找到相关信息,请重试。\n"); - } - return; -} - -// 工号的精确查找,返回表中id的位置,若找不到则返回NULL -// 参数:1.员工信息链表头结点 2.待查找工号 -// 返回:对应节点 -employee_list employee_findId(employee_list listHead, int value) -{ - employee_list p = listHead; - while (p != NULL) //遍历链表 - { - if (p->id == value) - { - break; - } - p = p->next; - } - return p; //返回对应节点 -} - -// 姓名的精确查找,返回表中name的位置,若找不到则返回NULL -// 参数:1.员工信息链表头结点 2.待查找姓名 -// 返回值:对应节点 -employee_list employee_findName(employee_list listHead, char value[]) -{ - employee_list p = listHead; - while (p != NULL) //遍历链表 - { - if (strcmp(p->name, value) == 0) - { - break; - } - p = p->next; - } - return p; -} - -// 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false -// 参数:1.待插入位置 2.节点 -// 返回值:true/false -bool employee_insertNode(employee_list position, employee * s) -{ - if (s == NULL) //判断信息节点是否为空 - { - printf("添加信息失败!\n"); - return false; - } - if (position == NULL) // position指向非法位置 - { - printf("添加信息失败!\n"); - return false; - } - s->next = position->next; // 修改新增结点后继指针 - position->next = s; // 修改position的后继指针 - if (s->next != NULL) // s不是链表尾节点 - s->next->pre = s; // 修改新增结点下一结点的前驱指针 - s->pre = position; // 修改新增结点前驱指针 - printf("添加信息成功。\n"); - return true; -} - -// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 -// 参数:1.待插入位置 2.节点 -// 返回值:链表头结点 -employee_list employee_addNode(employee_list listHead, employee *s) -{ - bool flag = employee_insertNode(listHead, s); //调用插入函数 - return listHead; -} - -// 将position指向的元素删除并返回true。若position指向非法位置,返回false -// 参数:1.员工信息链表 2.工号 -// 返回值:true/False -bool employee_deleteNode(employee_list listHead, int id) -{ - employee_list p = listHead, q = listHead->next; - while (q != NULL) //遍历链表 - { - if (q->id == id) - { - p->next = q->next; - delete q; // 找到了,删除该节点 - return true; - } - p = p->next; - q = q->next; - } - return false; //没找到 -} - -// 从文件读入已有信息 -// 参数:链表头结点 -// 返回值:true/false -bool employee_inputFromFile(employee_list listHead) -{ - FILE *fp = fopen("employee_info.txt", "r"); - if (fp == NULL) // 未打开成功 - { - puts("无法打开指定的文件,请重试。"); - system("pause"); - return false; - } - char temp[500]; // 假定一条数据的最大长度为500个字符 - int cnt = 0; // 记录读入数据条数 - while (!feof(fp)) - { - employee_list s = (employee *)malloc(sizeof(employee)); - fscanf(fp, "%d %s %s %s %d %lf %d %s %s", //读入信息 - &s->id, s->name, s->sex, s->phone, - &s->basic_salary, &s->salary, &s->absentDays, - s->department, s->job); - s->old_price = 0; - s->next = listHead->next; - listHead->next = s; - cnt++; - } - if (cnt != 0) - { - printf("成功读入 %d 条数据。\n", cnt); - } - else - { - printf("未能成功读取数据,请检查文件是否为空。\n"); - } - fclose(fp); - return true; -} - -bool employee_inputFromFile1(employee_list listHead) -{ - FILE *fp = fopen("employee_info1.txt", "r"); - if (fp == NULL) // 未打开成功 - { - puts("无法打开指定的文件,请重试。"); - system("pause"); - return false; - } - char temp[500]; // 假定一条数据的最大长度为500个字符 - int cnt = 0; // 记录读入数据条数 - while (!feof(fp)) - { - employee_list s = new employee; - /* - int id; - char name[15]; - char sex[5]; - char phone[15]; - int basic_salary; - double salary; - int absentDays; - char department[20]; - char job[20]; - fscanf(fp, "%d %s %s %s %d %lf %d %s %s", - &id, name, sex, phone, - &basic_salary, &salary, &absentDays, - department, job); - */ - fscanf(fp, "%d %s %s %s %d %lf %d %s %s\n", - &s->id, s->name, s->sex, s->phone, - &s->basic_salary, &s->salary, &s->absentDays, - s->department, s->job); - s->old_price = 0; - s->next = listHead->next; - listHead->next = s; - cnt++; - } - fclose(fp); - return true; -} - -// 计算并打印员工工资 -// 参数:员工信息链表 销售记录 -// 返回值:true/false -bool employee_countSalary(employee_list listHead, sales_Records re) -{ - employee_list p = listHead->next; - sales_Records q = NULL; - bool flag; - printf("%-15s %-4s %-4s %-12s %-8s %-8s %-8s %-20s %s\n", //输出提示信息 - "姓名", "工号", "性别", "电话", "基本工资", "工资", "缺勤天数", "部门", "职务"); - while (p != NULL) //遍历员工信息链表 - { - if (re != NULL) //销售记录链表不为空 - { - q = re->next; - } - double price = 0; - p->salary = p->basic_salary; //初始化员工工资 - if (p->absentDays > 0) - { - p->salary -= p->absentDays * 50.0; // 计算缺勤天数应该扣的钱 - } - while (q != NULL) //遍历销售记录 - { - if (strcmp(p->name, q->people) == 0) - { - price += q->price; - } - q = q->next; - } - if (price >= 0) - { - p->salary += (price - p->old_price) * 0.05; // 提成销售额的5% - p->old_price += price; - } - printf("%-15s %-4d %-4s %-12s %-8d %-8.2lf %-8d %-20s %s\n", //输出信息 - p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); - p = p->next; - - } - return true; -} - -// 将员工信息输出到文件 -// 参数:员工信息链表 -bool employee_printIntoFile(employee_list listHead) -{ - employee_list p = listHead->next; - FILE *fp = fopen("employ.txt", "w"); //打开文件 - if (fp == NULL) - { - puts("无法打开指定文件。"); - system("pause"); - return false; - } - int num = 0; - while (p != NULL) //将员工信息输出到文件 - { - fprintf(fp, "姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n工资:%.2lf\n缺勤天数:%d\n部门:%s\n职务:%s\n\n", - p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); - p = p->next; - num++; - } - printf("成功保存%d条数据到employ.txt中。\n", num); //提示信息 - fclose(fp); - system("pause"); - return true; -} - -bool employee_printIntoFile1(employee_list listHead) -{ - employee_list p = listHead->next; - FILE *fp = fopen("employee_info1.txt", "w"); //打开文件 - if (fp == NULL) - { - puts("无法打开指定文件。"); - system("pause"); - return false; - } - int num = 0; - while (p != NULL) //将员工信息输出到文件 - { - fprintf(fp, "%d %s %s %s %d %.2lf %d %s %s\n", - p->id, p->name, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); - p = p->next; - num++; - } - printf("成功保存%d条数据到employ_info1.txt中。\n", num); //提示信息 - fclose(fp); - return true; -} - - -//员工考勤管理 -//参数:员工信息链表头结点 -//返回值:true/false -bool employee_modifyAbsentDays(employee_list listHead) -{ - int id, day; - puts("请输入工号:"); - scanf("%d", &id); - employee_list p = employee_findId(listHead, id); //查找对应员工,返回相应节点 - if (p == NULL) - { - return false; - } - else - { - printf("员工姓名:%s\n工号:%d\n当前缺勤天数:%d\n", //输出修改前信息 - p->name, p->id, p->absentDays); - printf("请输入修改后缺勤天数:"); - scanf("%d", &day); - p->absentDays = day; //修改缺勤天数 - return true; - } -} - -// 释放链表所占空间(释放全部结点) -void employee_deleteLinkList(employee_list listHead) -{ - employee_list p = listHead; - while (p->next != NULL) // 依次释放链表结点所占空间 - { - p = p->next; - delete p->pre; - } - delete p; - return; -} -- Gitee From 22708fafdc0339b14f192d309eea003328802382 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Tue, 21 Jul 2020 22:42:54 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/employee.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.h | 70 ------------------------------------------------- 1 file changed, 70 deletions(-) delete mode 100644 code/employee.h diff --git a/code/employee.h b/code/employee.h deleted file mode 100644 index cf32a78..0000000 --- a/code/employee.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef __EMPLOYEE_H__ -#define __EMPLOYEE_H__ - -// 标准头文件结构 - -#include "sell.h" - -// 员工信息结点的数据结构(双向链表) -struct employee { - int id; // 工号 - char name[15]; // 姓名 - char sex[5]; // 性别 - char phone[15]; // 电话 - int basic_salary; // 基本工资 - double salary; //工资 - double old_price; // 历史销售额 - int absentDays; // 缺勤的天数 - char department[20]; // 部门 - char job[20]; // 职务 - struct employee *pre; // 前趋指针 - struct employee *next; // 后继指针 - employee(); // 构造函数,用于新建结点时初始化内容 -}; - -typedef employee *employee_list; -typedef records *sales_Records; -// employee_list 就相当于 employee* - -// 创建并返回一个空的带头结点的双向链表 -employee_list employee_makeEmpty(); - -// 工号的精确查找,返回表中id的位置,若找不到则返回NULL -employee_list employee_findId(employee_list listHead, int value); - -// 姓名的精确查找,返回表中name的位置,若找不到则返回NULL -employee_list employee_findName(employee_list listHead, char value[]); - -// 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false -bool employee_insertNode(employee_list position, employee* s); - -// 将position指向的元素删除并返回true。若position指向非法位置,返回false -bool employee_deleteNode(employee_list position,int id); - -// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 -employee_list employee_addNode(employee_list listHead, employee *s); - -// 释放链表所占空间(释放全部结点) -void employee_deleteLinkList(employee_list listHead); - -// 从文件读入已有信息 -bool employee_inputFromFile(employee_list listHead); -bool employee_inputFromFile1(employee_list listHead); - -// 计算并打印员工工资 -bool employee_countSalary(employee_list listHead, sales_Records re); - -// 将员工信息输出到文件 -bool employee_printIntoFile(employee_list listHead); - -bool employee_printIntoFile1(employee_list listHead); - -// 查找功能 1--ID查找 2--姓名查找 -void employee_find(employee_list head); - -// 员工管理模块菜单 -void employee_meau(); - -// 员工考勤管理 -bool employee_modifyAbsentDays(employee_list listHead); -#endif -- Gitee From 628478a5a7a95f15e991b9ad52d151d48f5b78a5 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Tue, 21 Jul 2020 22:44:15 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E5=AE=A1=E6=9F=A5=E5=90=8E=E5=91=98?= =?UTF-8?q?=E5=B7=A5=E4=BF=A1=E6=81=AF=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= =?UTF-8?q?2.0=20=E8=A7=A3=E5=86=B3=E4=BA=86=E5=BD=93employee=5Finfo1.txt?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=BA=E7=A9=BA=E6=97=B6=EF=BC=8C=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E7=BD=AE=E7=A9=BA=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.cpp | 553 ++++++++++++++++++++++++++++++++++++++++++++++ code/employee.h | 71 ++++++ 2 files changed, 624 insertions(+) create mode 100644 code/employee.cpp create mode 100644 code/employee.h diff --git a/code/employee.cpp b/code/employee.cpp new file mode 100644 index 0000000..fad893c --- /dev/null +++ b/code/employee.cpp @@ -0,0 +1,553 @@ +#include +#include +#include +#include +#include "employee.h" +using namespace std; + +__declspec(selectany) sales_Records all;//总销售记录头指针 + + +employee::employee() +{ + // 将结构体中所有成员都置为空 + id = 0; + memset(name, 0, sizeof(name)); + memset(sex, 0, sizeof(sex)); + memset(phone, 0, sizeof(phone)); + basic_salary = 0; + absentDays = 0; + salary = 0; + old_price = 0; + memset(department, 0, sizeof(department)); + memset(job, 0, sizeof(job)); + pre = NULL; + next = NULL; +} + + +// 员工信息管理菜单 +// 无参数 +// 无返回值 +void employee_meau() +{ + employee_list employee_List = employee_makeEmpty(); // 员工信息链表 + int employee_flag = employee_inputFromFile1(employee_List); + if (employee_flag == 0) + { + employee_List->next = NULL; + } + employee_list p; + bool flag; + int num; //操作数 + while (true) + { + system("cls"); + printf("欢迎使用员工信息管理!\n"); + printf("*******请输入要执行的功能:*******\n"); + printf("****** 1----增加员工信息 *********\n"); + printf("****** 2----查找员工信息 *********\n"); + printf("****** 3----删除员工信息 *********\n"); + printf("****** 4----统计员工工资 *********\n"); + printf("****** 5----员工考勤管理 *********\n"); + printf("********* 0----退出系统 **********\n"); + scanf("%d", &num); getchar(); + fflush(stdin); + system("cls"); + switch (num) + { + case 0: + { + flag = employee_printIntoFile1(employee_List); + return; //退出系统 + } + case 1: //添加员工信息 + { + int n; + printf("1--从文件读取 2--手动添加\n请选择:"); + scanf("%d", &n); + fflush(stdin); + if (n == 1) //文件读取 + { + employee_inputFromFile(employee_List); + } + else if (n == 2) + { + employee *s = new employee; //新增信息节点 + char str[30]; + int s1; + printf("员工姓名:\n"); + scanf("%s", str); + strcpy(s->name, str); + printf("员工工号:\n"); + scanf("%d", &s1); + s->id = s1; + printf("员工性别:\n"); + scanf("%s", str); + strcpy(s->sex, str); + printf("员工电话:\n"); + scanf("%s", str); + printf("基本工资:\n"); + scanf("%d", &s1); + s->basic_salary = s1; + strcpy(s->phone, str); + printf("所在部门:\n"); + scanf("%s", str); + strcpy(s->department, str); + printf("职务:\n"); + scanf("%s", str); + strcpy(s->job, str); + s->absentDays = 0; + s->salary = 0; + employee_List = employee_addNode(employee_List, s); //插入到链表中 + } + else + { + printf("输入错误!\n"); + break; + } + flag = employee_printIntoFile1(employee_List); + system("pause"); + break; + } + case 2: //查找员工信息 + { + if (employee_List->next == NULL) //判断系统内是否存在员工信息 + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + employee_find(employee_List); // 查找函数 + system("pause"); + break; + } + case 3: //删除员工信息 + { + if (employee_List->next == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + int id; //待删除员工工号 + printf("请输入工号:"); + scanf("%d", &id); + flag = employee_deleteNode(employee_List, id); //调用删除信息函数 + if (flag == true) + { + printf("删除成功。\n"); + } + else + { + printf("未找到相关信息,请重试。\n"); + } + flag = employee_printIntoFile1(employee_List); + system("pause"); + break; + } + case 4: //统计员工工资 + { + if (employee_List->next == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + char input; + bool flag; + flag = employee_countSalary(employee_List, all); //统计函数 + bool flag2 = employee_printIntoFile1(employee_List); + printf("是否将员工信息输出到文件?(y/n)"); + fflush(stdin); + scanf("%c", &input); + if (input == 'y') + { + bool f = employee_printIntoFile(employee_List); + } + else + { + break; + } + break; + } + case 5: //考勤管理 + { + if (employee_List->next == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + bool flag1 = employee_modifyAbsentDays(employee_List); // 修改函数 + if (flag1 == true) + { + printf("修改成功!\n"); + flag = employee_printIntoFile1(employee_List); + } + else + { + printf("未找到相关信息,请重试。\n"); + } + system("pause"); + break; + } + default: //输出错误 + { + printf("输入错误!\n"); + system("pause"); + } + } + } + employee_deleteLinkList(employee_List); +} + +// 创建并返回一个空的带头结点的双向链表 +// 无参数 +// 返回链表头结点 +employee_list employee_makeEmpty() +{ + employee_list head = new employee; //头结点定义并分配空间 + head->next = NULL; + return head; +} + +// 查找功能 1--ID查找 2--姓名查找 +// 参数:员工信息链表头结点 +// 返回值:无 +void employee_find(employee_list head) +{ + int id; //待查找工号 + int num; + printf("1--ID查找 2--姓名查找\n"); + employee_list p; + char name[30]; //待查找姓名 + scanf("%d", &num); // 查找类型 + if (num == 1) + { + printf("请输入工号:\n"); + scanf("%d", &id); + p = employee_findId(head, id); //ID查找 + } + else if (num == 2) + { + printf("请输入姓名:\n"); + scanf("%s", name); + p = employee_findName(head, name); // 姓名查找 + } + else + { + printf("输入错误!\n"); + return; + } + if (p != NULL) //存在则输出相应的信息 + { + printf("姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n缺勤天数:%d\n部门:%s\n职务:%s\n", + p->name, p->id, p->sex, p->phone, p->basic_salary, p->absentDays, p->department, p->job); + } + else //不存在输出提示信息 + { + printf("未找到相关信息,请重试。\n"); + } + return; +} + +// 工号的精确查找,返回表中id的位置,若找不到则返回NULL +// 参数:1.员工信息链表头结点 2.待查找工号 +// 返回:对应节点 +employee_list employee_findId(employee_list listHead, int value) +{ + employee_list p = listHead; + while (p != NULL) //遍历链表 + { + if (p->id == value) + { + break; + } + p = p->next; + } + return p; //返回对应节点 +} + +// 姓名的精确查找,返回表中name的位置,若找不到则返回NULL +// 参数:1.员工信息链表头结点 2.待查找姓名 +// 返回值:对应节点 +employee_list employee_findName(employee_list listHead, char value[]) +{ + employee_list p = listHead; + while (p != NULL) //遍历链表 + { + if (strcmp(p->name, value) == 0) + { + break; + } + p = p->next; + } + return p; +} + +// 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false +// 参数:1.待插入位置 2.节点 +// 返回值:true/false +bool employee_insertNode(employee_list position, employee * s) +{ + if (s == NULL) //判断信息节点是否为空 + { + printf("添加信息失败!\n"); + return false; + } + if (position == NULL) // position指向非法位置 + { + printf("添加信息失败!\n"); + return false; + } + s->next = position->next; // 修改新增结点后继指针 + position->next = s; // 修改position的后继指针 + if (s->next != NULL) // s不是链表尾节点 + s->next->pre = s; // 修改新增结点下一结点的前驱指针 + s->pre = position; // 修改新增结点前驱指针 + printf("添加信息成功。\n"); + return true; +} + +// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 +// 参数:1.待插入位置 2.节点 +// 返回值:链表头结点 +employee_list employee_addNode(employee_list listHead, employee *s) +{ + bool flag = employee_insertNode(listHead, s); //调用插入函数 + return listHead; +} + +// 将position指向的元素删除并返回true。若position指向非法位置,返回false +// 参数:1.员工信息链表 2.工号 +// 返回值:true/False +bool employee_deleteNode(employee_list listHead, int id) +{ + employee_list p = listHead, q = listHead->next; + while (q != NULL) //遍历链表 + { + if (q->id == id) + { + p->next = q->next; + delete q; // 找到了,删除该节点 + return true; + } + p = p->next; + q = q->next; + } + return false; //没找到 +} + +// 从文件读入已有信息 +// 参数:链表头结点 +// 返回值:true/false +bool employee_inputFromFile(employee_list listHead) +{ + FILE *fp = fopen("employee_info.txt", "r"); + if (fp == NULL) // 未打开成功 + { + puts("无法打开指定的文件,请重试。"); + system("pause"); + return false; + } + char temp[500]; // 假定一条数据的最大长度为500个字符 + int cnt = 0; // 记录读入数据条数 + while (!feof(fp)) + { + employee_list s = (employee *)malloc(sizeof(employee)); + fscanf(fp, "%d %s %s %s %d %lf %d %s %s", //读入信息 + &s->id, s->name, s->sex, s->phone, + &s->basic_salary, &s->salary, &s->absentDays, + s->department, s->job); + s->old_price = 0; + s->next = listHead->next; + listHead->next = s; + cnt++; + } + if (cnt != 0) + { + printf("成功读入 %d 条数据。\n", cnt); + } + else + { + printf("未能成功读取数据,请检查文件是否为空。\n"); + } + fclose(fp); + return true; +} + +int employee_inputFromFile1(employee_list listHead) +{ + FILE *fp = fopen("employee_info1.txt", "r"); + if (fp == NULL) // 未打开成功 + { + puts("无法打开指定的文件,请重试。"); + system("pause"); + return false; + } + char temp[500]; // 假定一条数据的最大长度为500个字符 + int cnt = 0; // 记录读入数据条数 + while (!feof(fp)) + { + employee_list s = new employee; + /* + int id; + char name[15]; + char sex[5]; + char phone[15]; + int basic_salary; + double salary; + int absentDays; + char department[20]; + char job[20]; + fscanf(fp, "%d %s %s %s %d %lf %d %s %s", + &id, name, sex, phone, + &basic_salary, &salary, &absentDays, + department, job); + */ + fscanf(fp, "%d %s %s %s %d %lf %d %s %s\n", + &s->id, s->name, s->sex, s->phone, + &s->basic_salary, &s->salary, &s->absentDays, + s->department, s->job); + s->old_price = 0; + if (s->id != 0) + { + s->next = listHead->next; + listHead->next = s; + cnt++; + } + } + fclose(fp); + return cnt; +} + +// 计算并打印员工工资 +// 参数:员工信息链表 销售记录 +// 返回值:true/false +bool employee_countSalary(employee_list listHead, sales_Records re) +{ + employee_list p = listHead->next; + sales_Records q = NULL; + bool flag; + printf("%-15s %-4s %-4s %-12s %-8s %-8s %-8s %-20s %s\n", //输出提示信息 + "姓名", "工号", "性别", "电话", "基本工资", "工资", "缺勤天数", "部门", "职务"); + while (p != NULL) //遍历员工信息链表 + { + if (re != NULL) //销售记录链表不为空 + { + q = re->next; + } + double price = 0; + p->salary = p->basic_salary; //初始化员工工资 + if (p->absentDays > 0) + { + p->salary -= p->absentDays * 50.0; // 计算缺勤天数应该扣的钱 + } + while (q != NULL) //遍历销售记录 + { + if (strcmp(p->name, q->people) == 0) + { + price += q->price; + } + q = q->next; + } + if (price >= 0) + { + p->salary += (price - p->old_price) * 0.05; // 提成销售额的5% + p->old_price += price; + } + printf("%-15s %-4d %-4s %-12s %-8d %-8.2lf %-8d %-20s %s\n", //输出信息 + p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); + p = p->next; + + } + return true; +} + +// 将员工信息输出到文件 +// 参数:员工信息链表 +bool employee_printIntoFile(employee_list listHead) +{ + employee_list p = listHead->next; + FILE *fp = fopen("employ.txt", "w"); //打开文件 + if (fp == NULL) + { + puts("无法打开指定文件。"); + system("pause"); + return false; + } + int num = 0; + while (p != NULL) //将员工信息输出到文件 + { + fprintf(fp, "姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n工资:%.2lf\n缺勤天数:%d\n部门:%s\n职务:%s\n\n", + p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); + p = p->next; + num++; + } + printf("成功保存%d条数据到employ.txt中。\n", num); //提示信息 + fclose(fp); + system("pause"); + return true; +} + +bool employee_printIntoFile1(employee_list listHead) +{ + employee_list p = listHead->next; + FILE *fp = fopen("employee_info1.txt", "w"); //打开文件 + if (fp == NULL) + { + puts("无法打开指定文件。"); + system("pause"); + return false; + } + int num = 0; + while (p != NULL) //将员工信息输出到文件 + { + fprintf(fp, "%d %s %s %s %d %.2lf %d %s %s\n", + p->id, p->name, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); + p = p->next; + num++; + } + printf("成功保存%d条数据到employ_info1.txt中。\n", num); //提示信息 + fclose(fp); + return true; +} + + +//员工考勤管理 +//参数:员工信息链表头结点 +//返回值:true/false +bool employee_modifyAbsentDays(employee_list listHead) +{ + int id, day; + puts("请输入工号:"); + scanf("%d", &id); + employee_list p = employee_findId(listHead, id); //查找对应员工,返回相应节点 + if (p == NULL) + { + return false; + } + else + { + printf("员工姓名:%s\n工号:%d\n当前缺勤天数:%d\n", //输出修改前信息 + p->name, p->id, p->absentDays); + printf("请输入修改后缺勤天数:"); + scanf("%d", &day); + p->absentDays = day; //修改缺勤天数 + return true; + } +} + +// 释放链表所占空间(释放全部结点) +void employee_deleteLinkList(employee_list listHead) +{ + employee_list p = listHead; + while (p->next != NULL) // 依次释放链表结点所占空间 + { + p = p->next; + delete p->pre; + } + delete p; + return; +} diff --git a/code/employee.h b/code/employee.h new file mode 100644 index 0000000..4c9989b --- /dev/null +++ b/code/employee.h @@ -0,0 +1,71 @@ +#ifndef __EMPLOYEE_H__ +#define __EMPLOYEE_H__ + +// 标准头文件结构 + +#include "sell.h" + +// 员工信息结点的数据结构(双向链表) +struct employee { + int id; // 工号 + char name[15]; // 姓名 + char sex[5]; // 性别 + char phone[15]; // 电话 + int basic_salary; // 基本工资 + double salary; //工资 + double old_price; // 历史销售额 + int absentDays; // 缺勤的天数 + char department[20]; // 部门 + char job[20]; // 职务 + struct employee *pre; // 前趋指针 + struct employee *next; // 后继指针 + employee(); // 构造函数,用于新建结点时初始化内容 +}; + +typedef employee *employee_list; +typedef records *sales_Records; +// employee_list 就相当于 employee* + +// 创建并返回一个空的带头结点的双向链表 +employee_list employee_makeEmpty(); + +// 工号的精确查找,返回表中id的位置,若找不到则返回NULL +employee_list employee_findId(employee_list listHead, int value); + +// 姓名的精确查找,返回表中name的位置,若找不到则返回NULL +employee_list employee_findName(employee_list listHead, char value[]); + +// 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false +bool employee_insertNode(employee_list position, employee* s); + +// 将position指向的元素删除并返回true。若position指向非法位置,返回false +bool employee_deleteNode(employee_list position,int id); + +// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 +employee_list employee_addNode(employee_list listHead, employee *s); + +// 释放链表所占空间(释放全部结点) +void employee_deleteLinkList(employee_list listHead); + +// 从文件读入已有信息 +bool employee_inputFromFile(employee_list listHead); + +int employee_inputFromFile1(employee_list listHead); + +// 计算并打印员工工资 +bool employee_countSalary(employee_list listHead, sales_Records re); + +// 将员工信息输出到文件 +bool employee_printIntoFile(employee_list listHead); + +bool employee_printIntoFile1(employee_list listHead); + +// 查找功能 1--ID查找 2--姓名查找 +void employee_find(employee_list head); + +// 员工管理模块菜单 +void employee_meau(); + +// 员工考勤管理 +bool employee_modifyAbsentDays(employee_list listHead); +#endif -- Gitee From 09e833c956bc0bd5caa099c754a2e58db22da945 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Wed, 22 Jul 2020 05:35:01 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E5=BA=93=E5=AD=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E3=80=81=E4=B8=BB=E7=95=8C=E9=9D=A2=E4=BB=A3=E7=A0=81=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.cpp | 15 --------------- code/employee_info1.txt | 28 ++++++++++++++-------------- code/main.cpp | 20 ++++++++++++++++++-- code/repo.cpp | 40 +++++++++++++++++++++++++++++++++++++++- code/repo.h | 3 +++ 5 files changed, 74 insertions(+), 32 deletions(-) diff --git a/code/employee.cpp b/code/employee.cpp index fad893c..21f8207 100644 --- a/code/employee.cpp +++ b/code/employee.cpp @@ -391,21 +391,6 @@ int employee_inputFromFile1(employee_list listHead) while (!feof(fp)) { employee_list s = new employee; - /* - int id; - char name[15]; - char sex[5]; - char phone[15]; - int basic_salary; - double salary; - int absentDays; - char department[20]; - char job[20]; - fscanf(fp, "%d %s %s %s %d %lf %d %s %s", - &id, name, sex, phone, - &basic_salary, &salary, &absentDays, - department, job); - */ fscanf(fp, "%d %s %s %s %d %lf %d %s %s\n", &s->id, s->name, s->sex, s->phone, &s->basic_salary, &s->salary, &s->absentDays, diff --git a/code/employee_info1.txt b/code/employee_info1.txt index d7b8ae5..a0e4dc2 100644 --- a/code/employee_info1.txt +++ b/code/employee_info1.txt @@ -1,15 +1,15 @@ -110 xiaomong F 13333330000 2200 2200.00 0 Division assistant -109 xiaozhong M 13255888855 4500 4500.00 0 SalesDepartment salesperson -108 wangliu F 13333333333 3200 3100.00 2 Division assistant -107 lisan M 13255555555 3500 3450.00 1 SalesDepartment salesperson -106 zhangsi M 13122220000 3000 2750.00 5 SalesDepartment salesperson -105 xiaoming F 13333330000 2200 2200.00 0 Division assistant -104 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson -103 wangwu F 13333333333 3200 3100.00 2 Division assistant -102 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson -101 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson -111 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson -112 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson -113 wangwu F 13333333333 3200 3100.00 2 Division assistant -114 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson 115 xiaoming F 13333330000 2200 1950.00 5 Division assistant +114 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson +113 wangwu F 13333333333 3200 3100.00 2 Division assistant +112 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson +111 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson +101 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson +102 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson +103 wangwu F 13333333333 3200 3100.00 2 Division assistant +104 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson +105 xiaoming F 13333330000 2200 2200.00 0 Division assistant +106 zhangsi M 13122220000 3000 2750.00 5 SalesDepartment salesperson +107 lisan M 13255555555 3500 3450.00 1 SalesDepartment salesperson +108 wangliu F 13333333333 3200 3100.00 2 Division assistant +109 xiaozhong M 13255888855 4500 4500.00 0 SalesDepartment salesperson +110 xiaomong F 13333330000 2200 2200.00 0 Division assistant diff --git a/code/main.cpp b/code/main.cpp index 6928721..b55c8b4 100644 --- a/code/main.cpp +++ b/code/main.cpp @@ -12,8 +12,15 @@ int main() { + // 初始化供应商信息和进货信息 InitList_suppliers(suppliers_head, suppliers_tail); InitList_commodity(commodity_head, commodity_tail); + Fadd_suppliers(suppliers_head, suppliers_tail); + Fadd_commodity(commodity_head, commodity_tail, suppliers_head, suppliers_tail); + + // 初始化总销售记录(历史销售记录) + initAllRecordList(); + int choice; // choice 接收由用户输入的指令代码 system("color fc"); while(true) @@ -60,6 +67,7 @@ int main() } case 0: // 退出系统 { + modifyRemainNumber(); // 退出系统前修改库存信息文件 return 0; } default: @@ -183,12 +191,19 @@ void GUI_Init() int main() { + // 初始化供应商信息和进货信息 InitList_suppliers(suppliers_head, suppliers_tail); InitList_commodity(commodity_head, commodity_tail); - system("title 销售管理系统"); + Fadd_suppliers(suppliers_head, suppliers_tail); + Fadd_commodity(commodity_head, commodity_tail, suppliers_head, suppliers_tail); + + // 初始化总销售记录(历史销售记录) + initAllRecordList(); + + system("title 超市管理系统"); system("color fc"); HWND HWND_console = GetForegroundWindow(); // 控制台窗口句柄 - PX_Initialize("销售管理系统:主界面", 800, 600); + PX_Initialize("超市管理系统:主界面", 800, 600); GUI_Init(); HWND HWND_GUI = GetForegroundWindow(); // 图形界面窗口句柄 ShowWindow(HWND_console, SW_MINIMIZE); @@ -249,6 +264,7 @@ int main() { ShowWindow(HWND_GUI, SW_MINIMIZE); ShowWindow(HWND_console, SW_RESTORE); + modifyRemainNumber(); // 退出系统前修改库存信息文件 system("cls"); printf("已退出超市管理系统。\n\n欢迎下次使用!\n"); return 0; diff --git a/code/repo.cpp b/code/repo.cpp index aa31aea..cde2be6 100644 --- a/code/repo.cpp +++ b/code/repo.cpp @@ -1,4 +1,5 @@ #include "repo.h" +#include "purchase.h" /************************************************************ * repo_printGoodsInfo -- 输出p所指向的商品信息 @@ -362,4 +363,41 @@ void repo_main() default:puts("输入错误!"); system("pause"); break; } -} \ No newline at end of file +} + + +/********************************************************* + * modifyRemainNumber -- 在退出系统前,修改库存信息文件, + * 把变动后的剩余库存值写入文件, + * 如果剩余库存为0,商品信息将不再写入文件 + * 参数:无 + * 返回值:无 + *********************************************************/ +void modifyRemainNumber() +{ + FILE *fp; + commodity p = commodity_head->next; + purchase s; + fp = fopen("commodity1.txt", "w"); + if(fp == NULL) + { + printf("库存商品信息文件 commodity1.txt 打开失败!"); + exit(0); + } + while(p != NULL) + { + if(p->remain_Number != 0) // 如果库存数量为0,则此条数据不再写入文件 + { + ListHandle_purchase(suppliers_head, s, p->id_Number); + fprintf(fp, "%s %s %d %d %d %s %s %d %lf %lf %d %d %d %d %s%c", + p->id_Number, p->goods_Name, p->purchase_Date.year, p->purchase_Date.month, p->purchase_Date.day, + s->source, s->channel, p->remain_Number, + p->buy_Price, p->sell_Price, p->produce_Date.year, p->produce_Date.month, p->produce_Date.day, + p->quality_Date, p->place, + (p->next != NULL) ? '\n' : ' ' // 最后一行数据的末尾有一个空格 + ); + } + p = p->next; + } + fclose(fp); +} diff --git a/code/repo.h b/code/repo.h index 6102c26..ae92741 100644 --- a/code/repo.h +++ b/code/repo.h @@ -31,4 +31,7 @@ bool repo_goodsOverdueWarning(goods *listHead); // 库存管理主函数 void repo_main(); +// 在退出系统前,修改库存信息文件,把变动后的剩余库存值写入文件 +void modifyRemainNumber(); + #endif -- Gitee From 5390ffc62fd29a8f1079c95798633b005bdd7e1a Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Wed, 22 Jul 2020 05:48:50 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/employee=5Finfo.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee_info.txt | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 code/employee_info.txt diff --git a/code/employee_info.txt b/code/employee_info.txt deleted file mode 100644 index b46d226..0000000 --- a/code/employee_info.txt +++ /dev/null @@ -1,5 +0,0 @@ -111 zhangsan M 13122220000 3000 3000 5 SalesDepartment salesperson -112 lisi M 13255555555 3500 3500 1 SalesDepartment salesperson -113 wangwu F 13333333333 3200 3200 2 Division assistant -114 xiaohong M 13255888855 4500 4500 0 SalesDepartment salesperson -115 xiaoming F 13333330000 2200 2200 0 Division assistant \ No newline at end of file -- Gitee From 54abe86969278f0b92bc4d4a3b4c3a0356fe91ec Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Wed, 22 Jul 2020 05:49:07 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/employee=5Finfo1.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee_info1.txt | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 code/employee_info1.txt diff --git a/code/employee_info1.txt b/code/employee_info1.txt deleted file mode 100644 index a0e4dc2..0000000 --- a/code/employee_info1.txt +++ /dev/null @@ -1,15 +0,0 @@ -115 xiaoming F 13333330000 2200 1950.00 5 Division assistant -114 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson -113 wangwu F 13333333333 3200 3100.00 2 Division assistant -112 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson -111 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson -101 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson -102 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson -103 wangwu F 13333333333 3200 3100.00 2 Division assistant -104 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson -105 xiaoming F 13333330000 2200 2200.00 0 Division assistant -106 zhangsi M 13122220000 3000 2750.00 5 SalesDepartment salesperson -107 lisan M 13255555555 3500 3450.00 1 SalesDepartment salesperson -108 wangliu F 13333333333 3200 3100.00 2 Division assistant -109 xiaozhong M 13255888855 4500 4500.00 0 SalesDepartment salesperson -110 xiaomong F 13333330000 2200 2200.00 0 Division assistant -- Gitee From d7be12df7276e4579719c9e937590a1d753b9575 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Wed, 22 Jul 2020 05:52:08 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=5F0722=201.employee=5Finfo.txt=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E2=80=9C=E4=BB=8E=E6=96=87=E4=BB=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E2=80=9D=E7=9A=84=E5=91=98=E5=B7=A5=E4=BF=A1=E6=81=AF=E3=80=82?= =?UTF-8?q?=202.employee=5Finfo1.txt=E4=BF=9D=E5=AD=98=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=9B=B4=E6=94=B9=E5=90=8E=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E7=9A=84=E4=BF=A1=E6=81=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee_info.txt | 5 +++++ code/employee_info1.txt | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 code/employee_info.txt create mode 100644 code/employee_info1.txt diff --git a/code/employee_info.txt b/code/employee_info.txt new file mode 100644 index 0000000..08cc6c0 --- /dev/null +++ b/code/employee_info.txt @@ -0,0 +1,5 @@ +111 xiaohua M 13122112200 3600 3600 5 SalesDepartment salesperson +112 lihua F 13256665555 3500 3500 1 SalesDepartment salesperson +113 wuyong F 13338889933 3200 3200 2 Division assistant +114 xiaodong M 13255655855 4700 4700 0 SalesDepartment salesperson +115 daming F 13303230000 2400 2400 0 Division assistant \ No newline at end of file diff --git a/code/employee_info1.txt b/code/employee_info1.txt new file mode 100644 index 0000000..92d35ff --- /dev/null +++ b/code/employee_info1.txt @@ -0,0 +1,5 @@ +125 xiaoming F 13333330000 2200 2200.00 0 Division assistant +124 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson +123 wangwu F 13333333333 3200 3100.00 2 Division assistant +122 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson +121 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson -- Gitee From e1988f5b965fbe8100982045a176e492085adf42 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Thu, 23 Jul 2020 18:17:23 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=80=9F=E8=A7=88=E6=A8=A1=E5=9D=97=EF=BC=8C=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=B6=E5=AE=83=E7=9B=B8=E5=85=B3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/analysis.cpp | 236 ++++++++++++++++++++++++++++++ code/analysis.h | 37 +++++ code/employee.cpp | 311 ++++++++++++++++++++-------------------- code/employee.h | 6 +- code/employee_info.txt | 10 +- code/employee_info1.txt | 20 +-- code/main.cpp | 69 +++++++-- code/repo.cpp | 22 ++- 8 files changed, 505 insertions(+), 206 deletions(-) create mode 100644 code/analysis.cpp create mode 100644 code/analysis.h diff --git a/code/analysis.cpp b/code/analysis.cpp new file mode 100644 index 0000000..853c96a --- /dev/null +++ b/code/analysis.cpp @@ -0,0 +1,236 @@ +#include "analysis.h" + +extern employee_list employee_List; // 员工信息链表头指针 +__declspec(selectany) records *all; // 总销售记录头指针 + +double totalSalesMoney = 0; // 当月总销售额 +double totalEmployeeSalary = 0; // 当月待发工资总额 +double totalPurchasePrice = 0; // 已经卖出去的商品的总进价 + +/********************************************************* + * sortingRuleOfEmployees -- 员工的排序规则: + * 将员工按当月销售额进行排序, + * 当销售额相同时按照姓名字典序进行排序 + * 参数:a,b:代表员工的销售额信息:pair<姓名, 当月销售额> + * 返回值:a应排在b前面时,返回true;否则返回false + *********************************************************/ +bool sortingRuleOfEmployees(pair a, pair b) +{ + if(!(fabs(a.second - b.second) < 1e-6)) // 销售额不同时 + return a.second > b.second; // 按当月销售额进行排序 + return a.first < b.first; // 否则按照姓名字典序排序 +} + + +/********************************************************************** + * sortingRuleOfGoods -- 商品的排序规则: + * 将商品按当月销量进行排序, + * 当销售额相同时按照商品名字典序进行排序 + * 参数:a,b:代表商品的销售信息:pair<商品id, 销售信息> + * 其中商品id(pair::first)等于销售信息中的商品id(pair::second.id_Number) + * 返回值:a应排在b前面时,返回true;否则返回false + **********************************************************************/ +bool sortingRuleOfGoods(pair a, pair b) +{ + if(a.second.count != b.second.count) // 销量不同时 + return a.second.count > b.second.count; // 按当月销量进行排序 + return strcmp(a.second.name, b.second.name) < 0; // 否则按照商品名字典序排序 +} + +/********************************************************* + * countSalespersonWinner -- 统计并输出销售冠军, + * 同时完成当月总销售额、 + * 已经卖出去的商品的总进价两个数值的计算 + * 参数:current_date:当前日期 + * 返回值:无 + *********************************************************/ +void countSalespersonWinner(date current_date) +{ + map emp_map; // 员工姓名到该员工当月销售额的映射 + for(employee_list p = employee_List->next; p != NULL; p = p->next) + { + emp_map[p->name] = 0; // 把每个员工当月销售额先初始化为0 + } + for(sales_Records p = all->next; p != NULL; p = p->next) + { + // 遍历总销售记录,统计每个员工当月销售额 + // 下面的if判断条件是为了筛选出当月的销售记录进行统计 + if(p->year == current_date.year && p->mon == current_date.month) + { + emp_map[p->people] += p->price; // 修改该员工当月销售额 + totalSalesMoney += p->price; // 修改当月总销售额 + goods *n = searchGoods(p->id, commodity_head); + totalPurchasePrice += p->count * n->buy_Price; // 修改已经卖出去的商品的总进价 + } + } + vector> emp_v; // 临时存储员工的销售额信息:pair<姓名, 当月销售额> + for(auto p : emp_map) + { + emp_v.push_back(p); + } + printf("销售冠军:\n"); + if(emp_v.size() == 0) // 当月无销售记录,无法统计销售冠军 + { + printf("暂无\n"); + } + else + { + sort(emp_v.begin(), emp_v.end(), sortingRuleOfEmployees); + char salespersonName[15]; + if(emp_v.size() >= 1 && !(fabs(emp_v[0].second) < 1e-6)) + { + strcpy(salespersonName, emp_v[0].first.c_str()); + printf("第一名:%s(%d) 当月销售额:%.2lf元\n", salespersonName, + employee_findName(employee_List, salespersonName)->id, emp_v[0].second); + if(emp_v.size() >= 2 && !(fabs(emp_v[1].second) < 1e-6)) + { + strcpy(salespersonName, emp_v[1].first.c_str()); + printf("第二名:%s(%d) 当月销售额:%.2lf元\n", salespersonName, + employee_findName(employee_List, salespersonName)->id, emp_v[1].second); + if(emp_v.size() >= 3 && !(fabs(emp_v[2].second) < 1e-6)) + { + strcpy(salespersonName, emp_v[2].first.c_str()); + printf("第三名:%s(%d) 当月销售额:%.2lf元\n", salespersonName, + employee_findName(employee_List, salespersonName)->id, emp_v[2].second); + } + else + { + printf("第三名:暂无\n"); + } + } + else + { + printf("第二名:暂无\n"); + } + } + else + { + printf("第一名:暂无\n"); + } + } + putchar('\n'); + return; +} + +/********************************************************* + * countSalespersonWinner -- 统计并输出销量之星 + * 参数:current_date:当前日期 + * 返回值:无 + *********************************************************/ +void countGoodsWinner(date current_date) +{ + map goods_map; // 商品id到该商品销售信息的映射 + for(commodity p = commodity_head->next; p != NULL; p = p->next) + { + goods_map[p->id_Number] = soldGoods(); // 初始化商品信息 + strcpy(goods_map[p->id_Number].id_Number, p->id_Number); // 商品id + strcpy(goods_map[p->id_Number].name, p->goods_Name); // 商品名 + goods_map[p->id_Number].count = 0; // 销量 + goods_map[p->id_Number].price = p->sell_Price; // 售出价格(单价,用于计算销售额) + } + for(sales_Records p = all->next; p != NULL; p = p->next) + { + // 遍历总销售记录,统计每个商品当月销量 + // 下面的if判断条件是为了筛选出当月的销售记录进行统计 + if(p->year == current_date.year && p->mon == current_date.month) + { + goods_map[p->id].count += p->count; + } + } + vector> goods_v; // 临时存储商品的销售信息:pair<商品id, 销售信息> + for(auto p : goods_map) + { + goods_v.push_back(p); + } + printf("销量之星:\n"); + if(goods_v.size() == 0) // 当月无销售记录,无法统计销量之星 + { + printf("暂无\n"); + } + else + { + sort(goods_v.begin(), goods_v.end(), sortingRuleOfGoods); + if(goods_v.size() >= 1 && goods_v[0].second.count != 0) + { + printf("第一名:%s(%s) 当月销量:%d 销售额:%.2lf元\n", goods_v[0].second.name, + goods_v[0].second.id_Number, goods_v[0].second.count, + goods_v[0].second.price * goods_v[0].second.count); + if(goods_v.size() >= 2 && goods_v[1].second.count != 0) + { + printf("第二名:%s(%s) 当月销量:%d 销售额:%.2lf元\n", goods_v[1].second.name, + goods_v[1].second.id_Number, goods_v[1].second.count, + goods_v[1].second.price * goods_v[1].second.count); + if(goods_v.size() >= 3 && goods_v[2].second.count != 0) + { + printf("第三名:%s(%s) 当月销量:%d 销售额:%.2lf元\n", goods_v[2].second.name, + goods_v[2].second.id_Number, goods_v[2].second.count, + goods_v[2].second.price * goods_v[2].second.count); + } + else + { + printf("第三名:暂无\n"); + } + } + else + { + printf("第二名:暂无\n"); + } + } + else + { + printf("第一名:暂无\n"); + } + } + putchar('\n'); + return; +} + +/********************************************************* + * data_overview -- 统计当月待发工资总额 + * 参数:无 + * 返回值:无 + *********************************************************/ +void countTotalEmployeeSalary() +{ + for(employee_list p = employee_List->next; p != NULL; p = p->next) + { + totalEmployeeSalary += p->salary; + } + return; +} + +/********************************************************* + * data_overview -- 数据速览,对当月的数据进行统计, + * 并输出相关数据 + * 参数:无 + * 返回值:无 + *********************************************************/ +void data_overview() +{ + time_t now; + struct tm *ptm; + time(&now); // 获取当前时间戳(1970-1-1以来经过的秒数) + ptm = localtime(&now); // 将时间戳转换为本地时间 + date current_date(1900 + ptm->tm_year, 1 + ptm->tm_mon, ptm->tm_mday); // 当前日期 + printf(" * * * * * 数 据 速 览 * * * * *\n\n", current_date.year, current_date.month); + printf("计算周期:%04d年%d月\n", current_date.year, current_date.month); + printf("数据截止至:%04d年%d月%d日\n\n", current_date.year, current_date.month, current_date.day); + totalSalesMoney = 0; // 初始化当月总销售额为0 + totalEmployeeSalary = 0; // 初始化当月待发工资总额为0 + totalPurchasePrice = 0; // 初始化已经卖出去的商品的总进价为0 + + // 统计并输出销售冠军,同时计算当月总销售额、已经卖出去的商品的总进价 + countSalespersonWinner(current_date); + // 统计并输出销量之星 + countGoodsWinner(current_date); + // 统计当月待发工资总额 + countTotalEmployeeSalary(); + + printf("本月总销售额:%.2lf元\n\n", totalSalesMoney); + printf("本月待发工资总额:%.2lf元\n\n", totalEmployeeSalary); + printf("盈亏:%.2lf元\n", totalSalesMoney - totalPurchasePrice - totalEmployeeSalary); + printf("(盈亏=总销售额-卖出商品的总进价-员工工资)\n\n"); + + system("pause"); + return; +} diff --git a/code/analysis.h b/code/analysis.h new file mode 100644 index 0000000..6d95df8 --- /dev/null +++ b/code/analysis.h @@ -0,0 +1,37 @@ +#ifndef __ANALYSIS_H__ +#define __ANALYSIS_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "date.h" +#include "employee.h" +#include "purchase.h" +#include "sell.h" +#include "sellFun.h" +using namespace std; + +// 员工的排序规则:将员工按当月销售额从高到低进行排序 +bool sortingRuleOfEmployees(pair a, pair b); + +// 商品的排序规则:将商品按当月销量从高到低进行排序 +bool sortingRuleOfGoods(pair a, pair b); + +// 统计并输出销售冠军,同时计算当月总销售额、已经卖出去的商品的总进价 +void countSalespersonWinner(date current_date); + +// 统计并输出销量之星 +void countGoodsWinner(date current_date); + +// 统计当月待发工资总额 +void countTotalEmployeeSalary(); + +// 数据速览,对当月的数据进行统计,并输出相关数据 +void data_overview(); + +#endif // !__ANALYSIS_H__ diff --git a/code/employee.cpp b/code/employee.cpp index 21f8207..1ee7a79 100644 --- a/code/employee.cpp +++ b/code/employee.cpp @@ -6,7 +6,7 @@ using namespace std; __declspec(selectany) sales_Records all;//总销售记录头指针 - +employee_list employee_List = employee_makeEmpty(); // 员工信息链表 employee::employee() { @@ -31,16 +31,10 @@ employee::employee() // 无返回值 void employee_meau() { - employee_list employee_List = employee_makeEmpty(); // 员工信息链表 - int employee_flag = employee_inputFromFile1(employee_List); - if (employee_flag == 0) - { - employee_List->next = NULL; - } employee_list p; bool flag; int num; //操作数 - while (true) + while(true) { system("cls"); printf("欢迎使用员工信息管理!\n"); @@ -54,149 +48,149 @@ void employee_meau() scanf("%d", &num); getchar(); fflush(stdin); system("cls"); - switch (num) - { - case 0: - { - flag = employee_printIntoFile1(employee_List); - return; //退出系统 - } - case 1: //添加员工信息 + switch(num) { - int n; - printf("1--从文件读取 2--手动添加\n请选择:"); - scanf("%d", &n); - fflush(stdin); - if (n == 1) //文件读取 + case 0: { - employee_inputFromFile(employee_List); - } - else if (n == 2) - { - employee *s = new employee; //新增信息节点 - char str[30]; - int s1; - printf("员工姓名:\n"); - scanf("%s", str); - strcpy(s->name, str); - printf("员工工号:\n"); - scanf("%d", &s1); - s->id = s1; - printf("员工性别:\n"); - scanf("%s", str); - strcpy(s->sex, str); - printf("员工电话:\n"); - scanf("%s", str); - printf("基本工资:\n"); - scanf("%d", &s1); - s->basic_salary = s1; - strcpy(s->phone, str); - printf("所在部门:\n"); - scanf("%s", str); - strcpy(s->department, str); - printf("职务:\n"); - scanf("%s", str); - strcpy(s->job, str); - s->absentDays = 0; - s->salary = 0; - employee_List = employee_addNode(employee_List, s); //插入到链表中 - } - else - { - printf("输入错误!\n"); - break; + flag = employee_printIntoFile1(employee_List); + return; //退出系统 } - flag = employee_printIntoFile1(employee_List); - system("pause"); - break; - } - case 2: //查找员工信息 - { - if (employee_List->next == NULL) //判断系统内是否存在员工信息 + case 1: //添加员工信息 { - printf("系统内暂无员工信息!\n"); + int n; + printf("1--从文件读取 2--手动添加\n请选择:"); + scanf("%d", &n); + fflush(stdin); + if(n == 1) //文件读取 + { + employee_inputFromFile(employee_List); + } + else if(n == 2) + { + employee *s = new employee; //新增信息节点 + char str[30]; + int s1; + printf("员工姓名:\n"); + scanf("%s", str); + strcpy(s->name, str); + printf("员工工号:\n"); + scanf("%d", &s1); + s->id = s1; + printf("员工性别:\n"); + scanf("%s", str); + strcpy(s->sex, str); + printf("员工电话:\n"); + scanf("%s", str); + printf("基本工资:\n"); + scanf("%d", &s1); + s->basic_salary = s1; + strcpy(s->phone, str); + printf("所在部门:\n"); + scanf("%s", str); + strcpy(s->department, str); + printf("职务:\n"); + scanf("%s", str); + strcpy(s->job, str); + s->absentDays = 0; + s->salary = 0; + employee_List = employee_addNode(employee_List, s); //插入到链表中 + } + else + { + printf("输入错误!\n"); + break; + } + flag = employee_printIntoFile1(employee_List); system("pause"); break; } - employee_find(employee_List); // 查找函数 - system("pause"); - break; - } - case 3: //删除员工信息 - { - if (employee_List->next == NULL) + case 2: //查找员工信息 { - printf("系统内暂无员工信息!\n"); + if(employee_List->next == NULL) //判断系统内是否存在员工信息 + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + employee_find(employee_List); // 查找函数 system("pause"); break; } - int id; //待删除员工工号 - printf("请输入工号:"); - scanf("%d", &id); - flag = employee_deleteNode(employee_List, id); //调用删除信息函数 - if (flag == true) - { - printf("删除成功。\n"); - } - else + case 3: //删除员工信息 { - printf("未找到相关信息,请重试。\n"); - } - flag = employee_printIntoFile1(employee_List); - system("pause"); - break; - } - case 4: //统计员工工资 - { - if (employee_List->next == NULL) - { - printf("系统内暂无员工信息!\n"); + if(employee_List->next == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + int id; //待删除员工工号 + printf("请输入工号:"); + scanf("%d", &id); + flag = employee_deleteNode(employee_List, id); //调用删除信息函数 + if(flag == true) + { + printf("删除成功。\n"); + } + else + { + printf("未找到相关信息,请重试。\n"); + } + flag = employee_printIntoFile1(employee_List); system("pause"); break; } - char input; - bool flag; - flag = employee_countSalary(employee_List, all); //统计函数 - bool flag2 = employee_printIntoFile1(employee_List); - printf("是否将员工信息输出到文件?(y/n)"); - fflush(stdin); - scanf("%c", &input); - if (input == 'y') - { - bool f = employee_printIntoFile(employee_List); - } - else + case 4: //统计员工工资 { + if(employee_List->next == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + char input; + bool flag; + flag = employee_countSalary(employee_List, all); //统计函数 + bool flag2 = employee_printIntoFile1(employee_List); + printf("是否将员工信息输出到文件?(y/n)"); + fflush(stdin); + scanf("%c", &input); + if(input == 'y') + { + bool f = employee_printIntoFile(employee_List); + } + else + { + break; + } break; } - break; - } - case 5: //考勤管理 - { - if (employee_List->next == NULL) + case 5: //考勤管理 { - printf("系统内暂无员工信息!\n"); + if(employee_List->next == NULL) + { + printf("系统内暂无员工信息!\n"); + system("pause"); + break; + } + bool flag1 = employee_modifyAbsentDays(employee_List); // 修改函数 + if(flag1 == true) + { + printf("修改成功!\n"); + flag = employee_printIntoFile1(employee_List); + } + else + { + printf("未找到相关信息,请重试。\n"); + } system("pause"); break; } - bool flag1 = employee_modifyAbsentDays(employee_List); // 修改函数 - if (flag1 == true) + default: //输出错误 { - printf("修改成功!\n"); - flag = employee_printIntoFile1(employee_List); - } - else - { - printf("未找到相关信息,请重试。\n"); + printf("输入错误!\n"); + system("pause"); } - system("pause"); - break; - } - default: //输出错误 - { - printf("输入错误!\n"); - system("pause"); - } } } employee_deleteLinkList(employee_List); @@ -223,13 +217,13 @@ void employee_find(employee_list head) employee_list p; char name[30]; //待查找姓名 scanf("%d", &num); // 查找类型 - if (num == 1) + if(num == 1) { printf("请输入工号:\n"); scanf("%d", &id); p = employee_findId(head, id); //ID查找 } - else if (num == 2) + else if(num == 2) { printf("请输入姓名:\n"); scanf("%s", name); @@ -240,7 +234,7 @@ void employee_find(employee_list head) printf("输入错误!\n"); return; } - if (p != NULL) //存在则输出相应的信息 + if(p != NULL) //存在则输出相应的信息 { printf("姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n缺勤天数:%d\n部门:%s\n职务:%s\n", p->name, p->id, p->sex, p->phone, p->basic_salary, p->absentDays, p->department, p->job); @@ -258,9 +252,9 @@ void employee_find(employee_list head) employee_list employee_findId(employee_list listHead, int value) { employee_list p = listHead; - while (p != NULL) //遍历链表 + while(p != NULL) //遍历链表 { - if (p->id == value) + if(p->id == value) { break; } @@ -275,9 +269,9 @@ employee_list employee_findId(employee_list listHead, int value) employee_list employee_findName(employee_list listHead, char value[]) { employee_list p = listHead; - while (p != NULL) //遍历链表 + while(p != NULL) //遍历链表 { - if (strcmp(p->name, value) == 0) + if(strcmp(p->name, value) == 0) { break; } @@ -289,21 +283,21 @@ employee_list employee_findName(employee_list listHead, char value[]) // 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false // 参数:1.待插入位置 2.节点 // 返回值:true/false -bool employee_insertNode(employee_list position, employee * s) +bool employee_insertNode(employee_list position, employee *s) { - if (s == NULL) //判断信息节点是否为空 + if(s == NULL) //判断信息节点是否为空 { printf("添加信息失败!\n"); return false; } - if (position == NULL) // position指向非法位置 + if(position == NULL) // position指向非法位置 { printf("添加信息失败!\n"); return false; } s->next = position->next; // 修改新增结点后继指针 position->next = s; // 修改position的后继指针 - if (s->next != NULL) // s不是链表尾节点 + if(s->next != NULL) // s不是链表尾节点 s->next->pre = s; // 修改新增结点下一结点的前驱指针 s->pre = position; // 修改新增结点前驱指针 printf("添加信息成功。\n"); @@ -325,9 +319,9 @@ employee_list employee_addNode(employee_list listHead, employee *s) bool employee_deleteNode(employee_list listHead, int id) { employee_list p = listHead, q = listHead->next; - while (q != NULL) //遍历链表 + while(q != NULL) //遍历链表 { - if (q->id == id) + if(q->id == id) { p->next = q->next; delete q; // 找到了,删除该节点 @@ -345,7 +339,7 @@ bool employee_deleteNode(employee_list listHead, int id) bool employee_inputFromFile(employee_list listHead) { FILE *fp = fopen("employee_info.txt", "r"); - if (fp == NULL) // 未打开成功 + if(fp == NULL) // 未打开成功 { puts("无法打开指定的文件,请重试。"); system("pause"); @@ -353,7 +347,7 @@ bool employee_inputFromFile(employee_list listHead) } char temp[500]; // 假定一条数据的最大长度为500个字符 int cnt = 0; // 记录读入数据条数 - while (!feof(fp)) + while(!feof(fp)) { employee_list s = (employee *)malloc(sizeof(employee)); fscanf(fp, "%d %s %s %s %d %lf %d %s %s", //读入信息 @@ -365,7 +359,7 @@ bool employee_inputFromFile(employee_list listHead) listHead->next = s; cnt++; } - if (cnt != 0) + if(cnt != 0) { printf("成功读入 %d 条数据。\n", cnt); } @@ -380,7 +374,7 @@ bool employee_inputFromFile(employee_list listHead) int employee_inputFromFile1(employee_list listHead) { FILE *fp = fopen("employee_info1.txt", "r"); - if (fp == NULL) // 未打开成功 + if(fp == NULL) // 未打开成功 { puts("无法打开指定的文件,请重试。"); system("pause"); @@ -388,7 +382,7 @@ int employee_inputFromFile1(employee_list listHead) } char temp[500]; // 假定一条数据的最大长度为500个字符 int cnt = 0; // 记录读入数据条数 - while (!feof(fp)) + while(!feof(fp)) { employee_list s = new employee; fscanf(fp, "%d %s %s %s %d %lf %d %s %s\n", @@ -396,7 +390,7 @@ int employee_inputFromFile1(employee_list listHead) &s->basic_salary, &s->salary, &s->absentDays, s->department, s->job); s->old_price = 0; - if (s->id != 0) + if(s->id != 0) { s->next = listHead->next; listHead->next = s; @@ -417,27 +411,27 @@ bool employee_countSalary(employee_list listHead, sales_Records re) bool flag; printf("%-15s %-4s %-4s %-12s %-8s %-8s %-8s %-20s %s\n", //输出提示信息 "姓名", "工号", "性别", "电话", "基本工资", "工资", "缺勤天数", "部门", "职务"); - while (p != NULL) //遍历员工信息链表 + while(p != NULL) //遍历员工信息链表 { - if (re != NULL) //销售记录链表不为空 + if(re != NULL) //销售记录链表不为空 { q = re->next; } double price = 0; p->salary = p->basic_salary; //初始化员工工资 - if (p->absentDays > 0) + if(p->absentDays > 0) { p->salary -= p->absentDays * 50.0; // 计算缺勤天数应该扣的钱 } - while (q != NULL) //遍历销售记录 + while(q != NULL) //遍历销售记录 { - if (strcmp(p->name, q->people) == 0) + if(strcmp(p->name, q->people) == 0) { price += q->price; } q = q->next; } - if (price >= 0) + if(price >= 0) { p->salary += (price - p->old_price) * 0.05; // 提成销售额的5% p->old_price += price; @@ -445,7 +439,6 @@ bool employee_countSalary(employee_list listHead, sales_Records re) printf("%-15s %-4d %-4s %-12s %-8d %-8.2lf %-8d %-20s %s\n", //输出信息 p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); p = p->next; - } return true; } @@ -456,14 +449,14 @@ bool employee_printIntoFile(employee_list listHead) { employee_list p = listHead->next; FILE *fp = fopen("employ.txt", "w"); //打开文件 - if (fp == NULL) + if(fp == NULL) { puts("无法打开指定文件。"); system("pause"); return false; } int num = 0; - while (p != NULL) //将员工信息输出到文件 + while(p != NULL) //将员工信息输出到文件 { fprintf(fp, "姓名:%s\n工号:%d\n性别:%s\n电话:%s\n基本工资:%d\n工资:%.2lf\n缺勤天数:%d\n部门:%s\n职务:%s\n\n", p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); @@ -480,14 +473,14 @@ bool employee_printIntoFile1(employee_list listHead) { employee_list p = listHead->next; FILE *fp = fopen("employee_info1.txt", "w"); //打开文件 - if (fp == NULL) + if(fp == NULL) { puts("无法打开指定文件。"); system("pause"); return false; } int num = 0; - while (p != NULL) //将员工信息输出到文件 + while(p != NULL) //将员工信息输出到文件 { fprintf(fp, "%d %s %s %s %d %.2lf %d %s %s\n", p->id, p->name, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); @@ -509,7 +502,7 @@ bool employee_modifyAbsentDays(employee_list listHead) puts("请输入工号:"); scanf("%d", &id); employee_list p = employee_findId(listHead, id); //查找对应员工,返回相应节点 - if (p == NULL) + if(p == NULL) { return false; } @@ -528,7 +521,7 @@ bool employee_modifyAbsentDays(employee_list listHead) void employee_deleteLinkList(employee_list listHead) { employee_list p = listHead; - while (p->next != NULL) // 依次释放链表结点所占空间 + while(p->next != NULL) // 依次释放链表结点所占空间 { p = p->next; delete p->pre; diff --git a/code/employee.h b/code/employee.h index 4c9989b..af295d1 100644 --- a/code/employee.h +++ b/code/employee.h @@ -26,6 +26,8 @@ typedef employee *employee_list; typedef records *sales_Records; // employee_list 就相当于 employee* +extern employee_list employee_List; + // 创建并返回一个空的带头结点的双向链表 employee_list employee_makeEmpty(); @@ -36,10 +38,10 @@ employee_list employee_findId(employee_list listHead, int value); employee_list employee_findName(employee_list listHead, char value[]); // 在position指向的结点之后插入一个结点,返回true。如果position指向非法位置,返回false -bool employee_insertNode(employee_list position, employee* s); +bool employee_insertNode(employee_list position, employee *s); // 将position指向的元素删除并返回true。若position指向非法位置,返回false -bool employee_deleteNode(employee_list position,int id); +bool employee_deleteNode(employee_list position, int id); // 使用头插法,在链表头部新增一个结点,返回新增结点的指针 employee_list employee_addNode(employee_list listHead, employee *s); diff --git a/code/employee_info.txt b/code/employee_info.txt index b46d226..08cc6c0 100644 --- a/code/employee_info.txt +++ b/code/employee_info.txt @@ -1,5 +1,5 @@ -111 zhangsan M 13122220000 3000 3000 5 SalesDepartment salesperson -112 lisi M 13255555555 3500 3500 1 SalesDepartment salesperson -113 wangwu F 13333333333 3200 3200 2 Division assistant -114 xiaohong M 13255888855 4500 4500 0 SalesDepartment salesperson -115 xiaoming F 13333330000 2200 2200 0 Division assistant \ No newline at end of file +111 xiaohua M 13122112200 3600 3600 5 SalesDepartment salesperson +112 lihua F 13256665555 3500 3500 1 SalesDepartment salesperson +113 wuyong F 13338889933 3200 3200 2 Division assistant +114 xiaodong M 13255655855 4700 4700 0 SalesDepartment salesperson +115 daming F 13303230000 2400 2400 0 Division assistant \ No newline at end of file diff --git a/code/employee_info1.txt b/code/employee_info1.txt index a0e4dc2..92d35ff 100644 --- a/code/employee_info1.txt +++ b/code/employee_info1.txt @@ -1,15 +1,5 @@ -115 xiaoming F 13333330000 2200 1950.00 5 Division assistant -114 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson -113 wangwu F 13333333333 3200 3100.00 2 Division assistant -112 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson -111 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson -101 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson -102 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson -103 wangwu F 13333333333 3200 3100.00 2 Division assistant -104 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson -105 xiaoming F 13333330000 2200 2200.00 0 Division assistant -106 zhangsi M 13122220000 3000 2750.00 5 SalesDepartment salesperson -107 lisan M 13255555555 3500 3450.00 1 SalesDepartment salesperson -108 wangliu F 13333333333 3200 3100.00 2 Division assistant -109 xiaozhong M 13255888855 4500 4500.00 0 SalesDepartment salesperson -110 xiaomong F 13333330000 2200 2200.00 0 Division assistant +125 xiaoming F 13333330000 2200 2200.00 0 Division assistant +124 xiaohong M 13255888855 4500 4500.00 0 SalesDepartment salesperson +123 wangwu F 13333333333 3200 3100.00 2 Division assistant +122 lisi M 13255555555 3500 3450.00 1 SalesDepartment salesperson +121 zhangsan M 13122220000 3000 2750.00 5 SalesDepartment salesperson diff --git a/code/main.cpp b/code/main.cpp index b55c8b4..efa5b1d 100644 --- a/code/main.cpp +++ b/code/main.cpp @@ -5,6 +5,7 @@ #include "purchase.h" #include "sellFun.h" #include "repo.h" +#include "analysis.h" #define __GUI__ // 有此宏定义时使用图形界面,没有时使用控制台界面 @@ -21,6 +22,13 @@ int main() // 初始化总销售记录(历史销售记录) initAllRecordList(); + // 初始化员工信息 + int employee_flag = employee_inputFromFile1(employee_List); + if(employee_flag == 0) + { + employee_List->next = NULL; + } + int choice; // choice 接收由用户输入的指令代码 system("color fc"); while(true) @@ -32,7 +40,8 @@ int main() puts(" 2 - 进货管理"); puts(" 3 - 销售管理"); puts(" 4 - 库存管理"); - puts("\n 0 - 退出系统\n"); + puts("\n 5 - 数据速览"); + puts(" 0 - 退出系统\n"); printf("请选择:"); scanf("%d", &choice); getchar(); switch(choice) @@ -65,6 +74,13 @@ int main() repo_main(); break; } + case 5: // 数据速览 + { + system("cls"); + system("title 超市管理系统 - 数据速览"); + data_overview(); + break; + } case 0: // 退出系统 { modifyRemainNumber(); // 退出系统前修改库存信息文件 @@ -92,12 +108,13 @@ enum CHOICE_CODE // PURCHASE_MODULE, // 进货管理 SELL_MODULE, // 销售管理 REPO_MODULE, // 库存管理 + ANALYSIS_MODULE, // 数据速览 EXIT_MODULE, // 退出系统 OTHER // 其它 }; CHOICE_CODE choice_code = OTHER; // 代表图形主界面选择了哪一个模块进入 -// 以下五个为响应函数,代表点击按钮时系统要执行的操作 +// 以下六个为响应函数,代表点击按钮时系统要执行的操作 px_void OnButtonClick_employeeModule(PX_Object *pObject, PX_Object_Event e, px_void *ptr) { choice_code = EMPLOYEE_MODULE; @@ -118,6 +135,11 @@ px_void OnButtonClick_repoModule(PX_Object *pObject, PX_Object_Event e, px_void choice_code = REPO_MODULE; } +px_void OnButtonClick_analysisModule(PX_Object *pObject, PX_Object_Event e, px_void *ptr) +{ + choice_code = ANALYSIS_MODULE; +} + px_void OnButtonClick_exitModule(PX_Object *pObject, PX_Object_Event e, px_void *ptr) { choice_code = EXIT_MODULE; @@ -136,55 +158,61 @@ void GUI_Init() px_texture employee_logo; // 定义"员工管理"模块logo对应的纹理结构 PX_LoadTextureFromFile(PX_GetMP(), &employee_logo, (px_char *)".\\image\\employee.bmp"); // 从文件加载一个图片放在纹理中 - PX_TextureRender(PX_GetSurface(), &employee_logo, 145, 160, + PX_TextureRender(PX_GetSurface(), &employee_logo, 145, 150, PX_TEXTURERENDER_REFPOINT_LEFTTOP, PX_NULL); // 绘制纹理 px_texture purchase_logo; // 定义"进货管理"模块logo对应的纹理结构 PX_LoadTextureFromFile(PX_GetMP(), &purchase_logo, (px_char *)".\\image\\purchase.bmp"); // 从文件加载一个图片放在纹理中 - PX_TextureRender(PX_GetSurface(), &purchase_logo, 545, 160, + PX_TextureRender(PX_GetSurface(), &purchase_logo, 545, 150, PX_TEXTURERENDER_REFPOINT_LEFTTOP, PX_NULL); // 绘制纹理 px_texture sell_logo; // 定义"销售管理"模块logo对应的纹理结构 PX_LoadTextureFromFile(PX_GetMP(), &sell_logo, (px_char *)".\\image\\sell.bmp"); // 从文件加载一个图片放在纹理中 - PX_TextureRender(PX_GetSurface(), &sell_logo, 145, 350, + PX_TextureRender(PX_GetSurface(), &sell_logo, 145, 340, PX_TEXTURERENDER_REFPOINT_LEFTTOP, PX_NULL); // 绘制纹理 px_texture repo_logo; // 定义"库存管理"模块logo对应的纹理结构 PX_LoadTextureFromFile(PX_GetMP(), &repo_logo, (px_char *)".\\image\\repo.bmp"); // 从文件加载一个图片放在纹理中 - PX_TextureRender(PX_GetSurface(), &repo_logo, 545, 350, + PX_TextureRender(PX_GetSurface(), &repo_logo, 545, 340, PX_TEXTURERENDER_REFPOINT_LEFTTOP, PX_NULL); // 绘制纹理 // 绘制按钮 PX_Object *Button_employee; // 定义"员工管理"按钮对象 Button_employee = PX_Object_PushButtonCreate(PX_GetMP(), PX_GetUiRoot(), - 160, 280, 80, 32, "员工管理", PX_COLOR(255, 0, 0, 0)); // 创建按钮 + 160, 270, 80, 32, "员工管理", PX_COLOR(255, 0, 0, 0)); // 创建按钮 PX_ObjectRegisterEvent(Button_employee, PX_OBJECT_EVENT_EXECUTE, OnButtonClick_employeeModule, PX_NULL); // 绑定响应函数 PX_Object *Button_purchase; // 定义"进货管理"按钮对象 Button_purchase = PX_Object_PushButtonCreate(PX_GetMP(), PX_GetUiRoot(), - 560, 280, 80, 32, "进货管理", PX_COLOR(255, 0, 0, 0)); // 创建按钮 + 560, 270, 80, 32, "进货管理", PX_COLOR(255, 0, 0, 0)); // 创建按钮 PX_ObjectRegisterEvent(Button_purchase, PX_OBJECT_EVENT_EXECUTE, OnButtonClick_purchaseModule, PX_NULL); // 绑定响应函数 PX_Object *Button_sell; // 定义"销售管理"按钮对象 Button_sell = PX_Object_PushButtonCreate(PX_GetMP(), PX_GetUiRoot(), - 160, 470, 80, 32, "销售管理", PX_COLOR(255, 0, 0, 0)); // 创建按钮 + 160, 460, 80, 32, "销售管理", PX_COLOR(255, 0, 0, 0)); // 创建按钮 PX_ObjectRegisterEvent(Button_sell, PX_OBJECT_EVENT_EXECUTE, OnButtonClick_sellModule, PX_NULL); // 绑定响应函数 PX_Object *Button_repo; // 定义"库存管理"按钮对象 Button_repo = PX_Object_PushButtonCreate(PX_GetMP(), PX_GetUiRoot(), - 560, 470, 80, 32, "库存管理", PX_COLOR(255, 0, 0, 0)); // 创建按钮 + 560, 460, 80, 32, "库存管理", PX_COLOR(255, 0, 0, 0)); // 创建按钮 PX_ObjectRegisterEvent(Button_repo, PX_OBJECT_EVENT_EXECUTE, OnButtonClick_repoModule, PX_NULL); // 绑定响应函数 + PX_Object *Button_analysis; // 定义"数据速览"按钮对象 + Button_analysis = PX_Object_PushButtonCreate(PX_GetMP(), PX_GetUiRoot(), + 270, 535, 80, 32, "数据速览", PX_COLOR(255, 0, 0, 0)); // 创建按钮 + PX_ObjectRegisterEvent(Button_analysis, PX_OBJECT_EVENT_EXECUTE, + OnButtonClick_analysisModule, PX_NULL); // 绑定响应函数 + PX_Object *Button_exit; // 定义"退出系统"按钮对象 Button_exit = PX_Object_PushButtonCreate(PX_GetMP(), PX_GetUiRoot(), - 360, 535, 80, 32, "退出系统", PX_COLOR(255, 0, 0, 0)); // 创建按钮 + 450, 535, 80, 32, "退出系统", PX_COLOR(255, 0, 0, 0)); // 创建按钮 PX_ObjectRegisterEvent(Button_exit, PX_OBJECT_EVENT_EXECUTE, OnButtonClick_exitModule, PX_NULL); // 绑定响应函数 } @@ -200,6 +228,13 @@ int main() // 初始化总销售记录(历史销售记录) initAllRecordList(); + // 初始化员工信息 + int employee_flag = employee_inputFromFile1(employee_List); + if(employee_flag == 0) + { + employee_List->next = NULL; + } + system("title 超市管理系统"); system("color fc"); HWND HWND_console = GetForegroundWindow(); // 控制台窗口句柄 @@ -209,7 +244,6 @@ int main() ShowWindow(HWND_console, SW_MINIMIZE); while(true) { - //GUI_Init(); while(PX_Loop()) { break; @@ -260,6 +294,17 @@ int main() ShowWindow(HWND_GUI, SW_RESTORE); break; } + case ANALYSIS_MODULE: // 数据速览 + { + ShowWindow(HWND_GUI, SW_MINIMIZE); + ShowWindow(HWND_console, SW_RESTORE); + system("cls"); + system("title 超市管理系统 - 数据速览"); + data_overview(); + ShowWindow(HWND_console, SW_MINIMIZE); + ShowWindow(HWND_GUI, SW_RESTORE); + break; + } case EXIT_MODULE: // 退出系统 { ShowWindow(HWND_GUI, SW_MINIMIZE); diff --git a/code/repo.cpp b/code/repo.cpp index cde2be6..35c6c27 100644 --- a/code/repo.cpp +++ b/code/repo.cpp @@ -368,8 +368,7 @@ void repo_main() /********************************************************* * modifyRemainNumber -- 在退出系统前,修改库存信息文件, - * 把变动后的剩余库存值写入文件, - * 如果剩余库存为0,商品信息将不再写入文件 + * 把变动后的剩余库存值写入文件 * 参数:无 * 返回值:无 *********************************************************/ @@ -386,17 +385,14 @@ void modifyRemainNumber() } while(p != NULL) { - if(p->remain_Number != 0) // 如果库存数量为0,则此条数据不再写入文件 - { - ListHandle_purchase(suppliers_head, s, p->id_Number); - fprintf(fp, "%s %s %d %d %d %s %s %d %lf %lf %d %d %d %d %s%c", - p->id_Number, p->goods_Name, p->purchase_Date.year, p->purchase_Date.month, p->purchase_Date.day, - s->source, s->channel, p->remain_Number, - p->buy_Price, p->sell_Price, p->produce_Date.year, p->produce_Date.month, p->produce_Date.day, - p->quality_Date, p->place, - (p->next != NULL) ? '\n' : ' ' // 最后一行数据的末尾有一个空格 - ); - } + ListHandle_purchase(suppliers_head, s, p->id_Number); + fprintf(fp, "%s %s %d %d %d %s %s %d %lf %lf %d %d %d %d %s%c", + p->id_Number, p->goods_Name, p->purchase_Date.year, p->purchase_Date.month, p->purchase_Date.day, + s->source, s->channel, p->remain_Number, + p->buy_Price, p->sell_Price, p->produce_Date.year, p->produce_Date.month, p->produce_Date.day, + p->quality_Date, p->place, + (p->next != NULL) ? '\n' : ' ' // 最后一行数据的末尾有一个空格 + ); p = p->next; } fclose(fp); -- Gitee