From 99c4dcf6dac8f51784a9c45b1f59d635632c9717 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Wed, 15 Jul 2020 23:01:09 +0800 Subject: [PATCH 01/17] =?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=81v1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- employee.cpp | 336 +++++++++++++++++++++++++++++++++++++++++++++++++++ employee.h | 71 +++++++++++ 2 files changed, 407 insertions(+) create mode 100644 employee.cpp create mode 100644 employee.h diff --git a/employee.cpp b/employee.cpp new file mode 100644 index 0000000..8039508 --- /dev/null +++ b/employee.cpp @@ -0,0 +1,336 @@ +#include +#include +#include +#include "employee.h" + +int employee_main() +{ + employee_list employee_List = employee_makeEmpty(),p; + sales_Records all; + bool flag; + printf("欢迎使用员工信息管理!\n"); + int num; + printf("*******请输入要执行的功能:*******\n"); + printf("****** 1----增加员工信息 *********\n"); + printf("****** 2----查找员工信息 *********\n"); + printf("****** 3----删除员工信息 *********\n"); + printf("****** 4----统计员工工资 *********\n"); + printf("********* 0----退出系统 **********\n"); + scanf("%d", &num); + while (num != 0) + { + switch (num) + { + case 0:return 0; + case 1: + { + employee_List = employee_addNode(employee_List); + } + case 2: + { + p = employee_find(employee_List); + printf("姓名:%s\n 工号:%d\n 性别:%s\n 电话:%s\n 基本工资:%d\n 工资:%.2lf\n 缺勤天数:%d\n 部门:%s\n 职务:%s\n", p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); + } + case 3: + { + p = employee_find(employee_List); + flag = employee_deleteNode(p); + if (flag == true) + { + printf("删除成功"); + } + else + { + printf("删除失败,请重试"); + } + } + case 4: + { + if (employee_countSalary(employee_List, all) == 1) + { + employee_printIntoFile(employee_List); + } + } + } + system("cls"); + printf("*******请输入要执行的功能:*******\n"); + scanf("%d", &num); + system("cls"); + } + return 0; +} + +employee::employee() +{ + // 将结构体中所有成员都置为空 + id = 0; + memset(name, 0, sizeof(name)); + memset(sex, 0, sizeof(sex)); + memset(phone, 0, sizeof(phone)); + basic_salary = 0; + absentDays = 0; + memset(department, 0, sizeof(department)); + memset(job, 0, sizeof(job)); + pre = NULL; + next = NULL; +} + +// 创建并返回一个空的带头结点的双向链表 +employee_list employee_makeEmpty() +{ + employee_list head = new employee; + return head; +} + +// 工号的精确查找,返回表中id的位置,若找不到则返回NULL +employee_list employee_findId(employee_list listHead, int value) +{ + employee_list p = listHead->next; + 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->next; + while (p != NULL) + { + if (strcmp(p->name, value) == 0) + break; + p = p->next; + } + return p; +} + +// 查找功能 1--ID查找 2--姓名查找 +employee_list employee_find(employee_list head) +{ + int num,id; + employee_list p; + char name[30]; + scanf("%d", &num); + if (num == 1) + { + printf("请输入工号:\n"); + scanf("%d", &id); + p = employee_findId(head, id); + return p; + } + if (num == 2) + { + printf("请输入姓名:\n"); + scanf("%s", name); + p = employee_findName(head, name); + 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); + system("cls"); + printf("员工性别:\n"); + scanf("%s", str); + strcpy(s->sex, str); + system("cls"); + printf("员工电话:\n"); + scanf("%s", str); + strcpy(s->phone, str); + system("cls"); + printf("所在部门:\n"); + scanf("%s", str); + strcpy(s->department, str); + system("cls"); + printf("职务:\n"); + scanf("%s", str); + strcpy(s->job, str); + system("cls"); + printf("员工工号:\n"); + scanf("%d", &s1); + s->id = s1; + system("cls"); + printf("基本工资:\n"); + scanf("%d", &s1); + s->basic_salary = s1; + system("cls"); + s->absentDays = 0; + s->salary = 0; + system("cls"); + s->next = position->next; // 修改新增结点后继指针 + position->next = s; // 修改position的后继指针 + if (s->next != NULL) // s不是链表尾节点 + s->next->pre = s; // 修改新增结点下一结点的前驱指针 + s->pre = position; // 修改新增结点前驱指针 + + // 在这个函数里没有给新增的结点赋值 + // 请在调用完该函数之后,给新增结点的每一项挨个赋值 + // 新增结点的指针就是“该函数的参数->next” + + return true; +} + +// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 +employee_list employee_addNode(employee_list listHead) +{ + employee_insertNode(listHead); + return listHead->next; +} + +// 将position指向的元素删除并返回true。若position指向非法位置,返回false +bool employee_deleteNode(employee_list position) +{ + // 第一,如果position指向非法位置(如NULL),此时返回false + // 第二,不能直接删除头结点,如需删除空链表请使用deleteLinkList函数 + if (position == NULL || position->pre == NULL) + { + return false; + } + position->pre->next = position->next; // 断开position与前一个的联系 + if (position->next != NULL) // position不是链表尾节点 + position->next->pre = position->pre; // 断开position与后一个的联系 + delete position; + position = NULL; + + return true; +} + + + +// 释放链表所占空间(释放全部结点) +void employee_deleteLinkList(employee_list listHead) +{ + employee *p = listHead; + while (p->next != NULL) // 依次释放链表结点所占空间 + { + p = p->next; + delete p->pre; + } + delete p; + return; +} + +// 从文件读入已有信息 +bool employee_inputFromFile(employee_list listHead) +{ + puts("请输入文件名或文件的地址,以回车结束。注意:地址中的'\\'应写作\"\\\\\"。"); + char fileName[200]; // 文件名或地址 + scanf("%[^\n]", fileName); + fflush(stdin); + FILE *fp = fopen(fileName, "r"); + if (fp == NULL) // 未打开成功 + { + puts("无法打开指定的文件,请重试。"); + system("pause"); + return false; + } + char temp[500]; // 假定一条数据的最大长度为500个字符 + int cnt = 0; // 记录读入数据条数 + while (fgets(temp, 500, fp) != NULL) + { + employee *s = employee_addNode(listHead); + sscanf(temp, "%d\t%s\t%s\t%s\t%d\t%d\t%s\t%s", + &s->id, s->name, s->sex, s->phone, + &s->basic_salary, &s->absentDays, + s->department, s->job); + cnt++; + } + if (cnt != 0) + { + printf("成功读入 %d 条数据。", cnt); + } + else + { + printf("未能成功读取数据,请检查文件 %s 是否为空。\n", fileName); + } + fclose(fp); + system("pause"); + return true; +} + +// 计算并打印员工工资 +int employee_countSalary(employee_list listHead,sales_Records re) +{ + employee_list p = listHead->next; + sales_Records q = re; + char input; + bool flag; + printf("姓名 工号 性别 电话 基本工资 工资 缺勤天数 部门 职务"); + while (p != NULL) + { + p->salary = p->basic_salary; + if (p->absentDays > 2) + { + p->salary -= p->absentDays * 50; // 计算缺勤天数应该扣的钱 + } + while (q != NULL) + { + if (strcmp(p->name, q->people) == 0) + { + p->salary += q->count*q->price*0.05; // 提成销售额的5% + } + q = q->next; + } + printf("%s %d %s %s %d %.2lf %d %s %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)"); + scanf("%c", &input); + if(input=='y') + { + return 1; + } + else + { + return 0; + } +} + +// 将员工信息输出到文件 +bool employee_printIntoFile(employee_list listHead) +{ + employee_list p = listHead->next; + if (p->next == NULL) + { + puts("\n当前系统中暂无记录,请输入信息后再尝试保存\n"); + system("pause"); + return false; + } + puts("请输入文件名,以回车结束"); + char filename[20]; + scanf("%[^\n]", filename); + FILE *fp = fopen(filename, "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", 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条数据到%s", num, filename); + fclose(fp); + system("pause"); + return true; +} + diff --git a/employee.h b/employee.h new file mode 100644 index 0000000..a9acda7 --- /dev/null +++ b/employee.h @@ -0,0 +1,71 @@ +#ifndef __EMPLOYEE_H__ +#define __EMPLOYEE_H__ + +// 标准头文件结构 + +// 员工信息结点的数据结构(双向链表) +struct employee { + int id; // 工号 + char name[10]; // 姓名 + char sex[5]; // 性别 + char phone[15]; // 电话 + int basic_salary; // 基本工资 + double salary; //工资 + int absentDays; // 缺勤的天数 + char department[30]; // 部门 + char job[30]; // 职务 + struct employee *pre; // 前趋指针 + struct employee *next; // 后继指针 + employee(); // 构造函数,用于新建结点时初始化内容 +}; + +struct records +{ + int id; + char goodName[20]; + char people[20]; // 销售员 + int count; // 销售数量 + double price; // 销售金额 + int year; + int mon; + int hour; + int min; + int sec; + records * next; +}; + +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); + +// 将员工信息输出到文件 +bool employee_printIntoFile(employee_list listHead); + +#endif -- Gitee From 61832b9751204f77f6116037e1bf14796c3e9100 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Wed, 15 Jul 2020 23:01:57 +0800 Subject: [PATCH 02/17] =?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 | 149 ---------------------------------------------- 1 file changed, 149 deletions(-) delete mode 100644 code/employee.cpp diff --git a/code/employee.cpp b/code/employee.cpp deleted file mode 100644 index 0fc8626..0000000 --- a/code/employee.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include -#include -#include -#include "employee.h" - -employee::employee() -{ - // 将结构体中所有成员都置为空 - id = 0; - memset(name, 0, sizeof(name)); - memset(sex, 0, sizeof(sex)); - memset(phone, 0, sizeof(phone)); - basic_salary = 0; - absentDays = 0; - memset(department, 0, sizeof(department)); - memset(job, 0, sizeof(job)); - pre = NULL; - next = NULL; -} - -// 创建并返回一个空的带头结点的双向链表 -employee_list employee_makeEmpty() -{ - employee_list head = new employee; - return head; -} - -// 工号的精确查找,返回表中id的位置,若找不到则返回NULL -employee_list employee_findId(employee_list listHead, int value) -{ - employee_list p = listHead->next; - 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->next; - 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; - s->next = position->next; // 修改新增结点后继指针 - position->next = s; // 修改position的后继指针 - if(s->next != NULL) // s不是链表尾节点 - s->next->pre = s; // 修改新增结点下一结点的前驱指针 - s->pre = position; // 修改新增结点前驱指针 - - // 在这个函数里没有给新增的结点赋值 - // 请在调用完该函数之后,给新增结点的每一项挨个赋值 - // 新增结点的指针就是“该函数的参数->next” - - return true; -} - -// 将position指向的元素删除并返回true。若position指向非法位置,返回false -bool employee_deleteNode(employee_list position) -{ - // 第一,如果position指向非法位置(如NULL),此时返回false - // 第二,不能直接删除头结点,如需删除空链表请使用deleteLinkList函数 - if(position == NULL || position->pre == NULL) - { - return false; - } - position->pre->next = position->next; // 断开position与前一个的联系 - if(position->next != NULL) // position不是链表尾节点 - position->next->pre = position->pre; // 断开position与后一个的联系 - delete position; - position = NULL; - - return true; -} - -// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 -employee_list employee_addNode(employee_list listHead) -{ - employee_insertNode(listHead); - return listHead->next; -} - -// 释放链表所占空间(释放全部结点) -void employee_deleteLinkList(employee_list listHead) -{ - employee *p = listHead; - while(p->next != NULL) // 依次释放链表结点所占空间 - { - p = p->next; - delete p->pre; - } - delete p; - return; -} - -// 从文件读入已有信息 -bool employee_inputFromFile(employee_list listHead) -{ - puts("请输入文件名或文件的地址,以回车结束。注意:地址中的'\\'应写作\"\\\\\"。"); - char fileName[200]; // 文件名或地址 - scanf("%[^\n]", fileName); - fflush(stdin); - FILE *fp = fopen(fileName, "r"); - if(fp == NULL) // 未打开成功 - { - puts("无法打开指定的文件,请重试。"); - system("pause"); - return false; - } - char temp[500]; // 假定一条数据的最大长度为500个字符 - int cnt = 0; // 记录读入数据条数 - while(fgets(temp, 500, fp) != NULL) - { - employee *s = employee_addNode(listHead); - sscanf(temp, "%d\t%s\t%s\t%s\t%d\t%d\t%s\t%s", - &s->id, s->name, s->sex, s->phone, - &s->basic_salary, &s->absentDays, - s->department, s->job); - cnt++; - } - if(cnt != 0) - { - printf("成功读入 %d 条数据。", cnt); - } - else - { - printf("未能成功读取数据,请检查文件 %s 是否为空。\n", fileName); - } - fclose(fp); - system("pause"); - return true; -} \ No newline at end of file -- Gitee From 7a3c0a4748e46d23508ba73f2b4eae33f1b17074 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Wed, 15 Jul 2020 23:02:30 +0800 Subject: [PATCH 03/17] =?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 | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) delete mode 100644 code/employee.h diff --git a/code/employee.h b/code/employee.h deleted file mode 100644 index 4cab13f..0000000 --- a/code/employee.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef __EMPLOYEE_H__ -#define __EMPLOYEE_H__ - -// 标准头文件结构 - -// 员工信息结点的数据结构(双向链表) -struct employee { - int id; // 工号 - char name[10]; // 姓名 - char sex[5]; // 性别 - char phone[15]; // 电话 - int basic_salary; // 基本工资 - int absentDays; // 缺勤的天数 - char department[30]; // 部门 - char job[30]; // 职务 - struct employee *pre; // 前趋指针 - struct employee *next; // 后继指针 - employee(); // 构造函数,用于新建结点时初始化内容 -}; - -typedef employee *employee_list; -// 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); - -#endif -- Gitee From 5f3cd14848657d893c4a72f00d76cc459f34ca71 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Wed, 15 Jul 2020 23:02:59 +0800 Subject: [PATCH 04/17] =?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=81v1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.cpp | 336 ++++++++++++++++++++++++++++++++++++++++++++++ code/employee.h | 71 ++++++++++ 2 files changed, 407 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..8039508 --- /dev/null +++ b/code/employee.cpp @@ -0,0 +1,336 @@ +#include +#include +#include +#include "employee.h" + +int employee_main() +{ + employee_list employee_List = employee_makeEmpty(),p; + sales_Records all; + bool flag; + printf("欢迎使用员工信息管理!\n"); + int num; + printf("*******请输入要执行的功能:*******\n"); + printf("****** 1----增加员工信息 *********\n"); + printf("****** 2----查找员工信息 *********\n"); + printf("****** 3----删除员工信息 *********\n"); + printf("****** 4----统计员工工资 *********\n"); + printf("********* 0----退出系统 **********\n"); + scanf("%d", &num); + while (num != 0) + { + switch (num) + { + case 0:return 0; + case 1: + { + employee_List = employee_addNode(employee_List); + } + case 2: + { + p = employee_find(employee_List); + printf("姓名:%s\n 工号:%d\n 性别:%s\n 电话:%s\n 基本工资:%d\n 工资:%.2lf\n 缺勤天数:%d\n 部门:%s\n 职务:%s\n", p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); + } + case 3: + { + p = employee_find(employee_List); + flag = employee_deleteNode(p); + if (flag == true) + { + printf("删除成功"); + } + else + { + printf("删除失败,请重试"); + } + } + case 4: + { + if (employee_countSalary(employee_List, all) == 1) + { + employee_printIntoFile(employee_List); + } + } + } + system("cls"); + printf("*******请输入要执行的功能:*******\n"); + scanf("%d", &num); + system("cls"); + } + return 0; +} + +employee::employee() +{ + // 将结构体中所有成员都置为空 + id = 0; + memset(name, 0, sizeof(name)); + memset(sex, 0, sizeof(sex)); + memset(phone, 0, sizeof(phone)); + basic_salary = 0; + absentDays = 0; + memset(department, 0, sizeof(department)); + memset(job, 0, sizeof(job)); + pre = NULL; + next = NULL; +} + +// 创建并返回一个空的带头结点的双向链表 +employee_list employee_makeEmpty() +{ + employee_list head = new employee; + return head; +} + +// 工号的精确查找,返回表中id的位置,若找不到则返回NULL +employee_list employee_findId(employee_list listHead, int value) +{ + employee_list p = listHead->next; + 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->next; + while (p != NULL) + { + if (strcmp(p->name, value) == 0) + break; + p = p->next; + } + return p; +} + +// 查找功能 1--ID查找 2--姓名查找 +employee_list employee_find(employee_list head) +{ + int num,id; + employee_list p; + char name[30]; + scanf("%d", &num); + if (num == 1) + { + printf("请输入工号:\n"); + scanf("%d", &id); + p = employee_findId(head, id); + return p; + } + if (num == 2) + { + printf("请输入姓名:\n"); + scanf("%s", name); + p = employee_findName(head, name); + 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); + system("cls"); + printf("员工性别:\n"); + scanf("%s", str); + strcpy(s->sex, str); + system("cls"); + printf("员工电话:\n"); + scanf("%s", str); + strcpy(s->phone, str); + system("cls"); + printf("所在部门:\n"); + scanf("%s", str); + strcpy(s->department, str); + system("cls"); + printf("职务:\n"); + scanf("%s", str); + strcpy(s->job, str); + system("cls"); + printf("员工工号:\n"); + scanf("%d", &s1); + s->id = s1; + system("cls"); + printf("基本工资:\n"); + scanf("%d", &s1); + s->basic_salary = s1; + system("cls"); + s->absentDays = 0; + s->salary = 0; + system("cls"); + s->next = position->next; // 修改新增结点后继指针 + position->next = s; // 修改position的后继指针 + if (s->next != NULL) // s不是链表尾节点 + s->next->pre = s; // 修改新增结点下一结点的前驱指针 + s->pre = position; // 修改新增结点前驱指针 + + // 在这个函数里没有给新增的结点赋值 + // 请在调用完该函数之后,给新增结点的每一项挨个赋值 + // 新增结点的指针就是“该函数的参数->next” + + return true; +} + +// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 +employee_list employee_addNode(employee_list listHead) +{ + employee_insertNode(listHead); + return listHead->next; +} + +// 将position指向的元素删除并返回true。若position指向非法位置,返回false +bool employee_deleteNode(employee_list position) +{ + // 第一,如果position指向非法位置(如NULL),此时返回false + // 第二,不能直接删除头结点,如需删除空链表请使用deleteLinkList函数 + if (position == NULL || position->pre == NULL) + { + return false; + } + position->pre->next = position->next; // 断开position与前一个的联系 + if (position->next != NULL) // position不是链表尾节点 + position->next->pre = position->pre; // 断开position与后一个的联系 + delete position; + position = NULL; + + return true; +} + + + +// 释放链表所占空间(释放全部结点) +void employee_deleteLinkList(employee_list listHead) +{ + employee *p = listHead; + while (p->next != NULL) // 依次释放链表结点所占空间 + { + p = p->next; + delete p->pre; + } + delete p; + return; +} + +// 从文件读入已有信息 +bool employee_inputFromFile(employee_list listHead) +{ + puts("请输入文件名或文件的地址,以回车结束。注意:地址中的'\\'应写作\"\\\\\"。"); + char fileName[200]; // 文件名或地址 + scanf("%[^\n]", fileName); + fflush(stdin); + FILE *fp = fopen(fileName, "r"); + if (fp == NULL) // 未打开成功 + { + puts("无法打开指定的文件,请重试。"); + system("pause"); + return false; + } + char temp[500]; // 假定一条数据的最大长度为500个字符 + int cnt = 0; // 记录读入数据条数 + while (fgets(temp, 500, fp) != NULL) + { + employee *s = employee_addNode(listHead); + sscanf(temp, "%d\t%s\t%s\t%s\t%d\t%d\t%s\t%s", + &s->id, s->name, s->sex, s->phone, + &s->basic_salary, &s->absentDays, + s->department, s->job); + cnt++; + } + if (cnt != 0) + { + printf("成功读入 %d 条数据。", cnt); + } + else + { + printf("未能成功读取数据,请检查文件 %s 是否为空。\n", fileName); + } + fclose(fp); + system("pause"); + return true; +} + +// 计算并打印员工工资 +int employee_countSalary(employee_list listHead,sales_Records re) +{ + employee_list p = listHead->next; + sales_Records q = re; + char input; + bool flag; + printf("姓名 工号 性别 电话 基本工资 工资 缺勤天数 部门 职务"); + while (p != NULL) + { + p->salary = p->basic_salary; + if (p->absentDays > 2) + { + p->salary -= p->absentDays * 50; // 计算缺勤天数应该扣的钱 + } + while (q != NULL) + { + if (strcmp(p->name, q->people) == 0) + { + p->salary += q->count*q->price*0.05; // 提成销售额的5% + } + q = q->next; + } + printf("%s %d %s %s %d %.2lf %d %s %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)"); + scanf("%c", &input); + if(input=='y') + { + return 1; + } + else + { + return 0; + } +} + +// 将员工信息输出到文件 +bool employee_printIntoFile(employee_list listHead) +{ + employee_list p = listHead->next; + if (p->next == NULL) + { + puts("\n当前系统中暂无记录,请输入信息后再尝试保存\n"); + system("pause"); + return false; + } + puts("请输入文件名,以回车结束"); + char filename[20]; + scanf("%[^\n]", filename); + FILE *fp = fopen(filename, "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", 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条数据到%s", num, filename); + fclose(fp); + system("pause"); + return true; +} + diff --git a/code/employee.h b/code/employee.h new file mode 100644 index 0000000..a9acda7 --- /dev/null +++ b/code/employee.h @@ -0,0 +1,71 @@ +#ifndef __EMPLOYEE_H__ +#define __EMPLOYEE_H__ + +// 标准头文件结构 + +// 员工信息结点的数据结构(双向链表) +struct employee { + int id; // 工号 + char name[10]; // 姓名 + char sex[5]; // 性别 + char phone[15]; // 电话 + int basic_salary; // 基本工资 + double salary; //工资 + int absentDays; // 缺勤的天数 + char department[30]; // 部门 + char job[30]; // 职务 + struct employee *pre; // 前趋指针 + struct employee *next; // 后继指针 + employee(); // 构造函数,用于新建结点时初始化内容 +}; + +struct records +{ + int id; + char goodName[20]; + char people[20]; // 销售员 + int count; // 销售数量 + double price; // 销售金额 + int year; + int mon; + int hour; + int min; + int sec; + records * next; +}; + +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); + +// 将员工信息输出到文件 +bool employee_printIntoFile(employee_list listHead); + +#endif -- Gitee From c61057409b205837edcc25d6f08f4a76fd645114 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Thu, 16 Jul 2020 13:14:19 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20em?= =?UTF-8?q?ployee.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- employee.cpp | 336 --------------------------------------------------- 1 file changed, 336 deletions(-) delete mode 100644 employee.cpp diff --git a/employee.cpp b/employee.cpp deleted file mode 100644 index 8039508..0000000 --- a/employee.cpp +++ /dev/null @@ -1,336 +0,0 @@ -#include -#include -#include -#include "employee.h" - -int employee_main() -{ - employee_list employee_List = employee_makeEmpty(),p; - sales_Records all; - bool flag; - printf("欢迎使用员工信息管理!\n"); - int num; - printf("*******请输入要执行的功能:*******\n"); - printf("****** 1----增加员工信息 *********\n"); - printf("****** 2----查找员工信息 *********\n"); - printf("****** 3----删除员工信息 *********\n"); - printf("****** 4----统计员工工资 *********\n"); - printf("********* 0----退出系统 **********\n"); - scanf("%d", &num); - while (num != 0) - { - switch (num) - { - case 0:return 0; - case 1: - { - employee_List = employee_addNode(employee_List); - } - case 2: - { - p = employee_find(employee_List); - printf("姓名:%s\n 工号:%d\n 性别:%s\n 电话:%s\n 基本工资:%d\n 工资:%.2lf\n 缺勤天数:%d\n 部门:%s\n 职务:%s\n", p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); - } - case 3: - { - p = employee_find(employee_List); - flag = employee_deleteNode(p); - if (flag == true) - { - printf("删除成功"); - } - else - { - printf("删除失败,请重试"); - } - } - case 4: - { - if (employee_countSalary(employee_List, all) == 1) - { - employee_printIntoFile(employee_List); - } - } - } - system("cls"); - printf("*******请输入要执行的功能:*******\n"); - scanf("%d", &num); - system("cls"); - } - return 0; -} - -employee::employee() -{ - // 将结构体中所有成员都置为空 - id = 0; - memset(name, 0, sizeof(name)); - memset(sex, 0, sizeof(sex)); - memset(phone, 0, sizeof(phone)); - basic_salary = 0; - absentDays = 0; - memset(department, 0, sizeof(department)); - memset(job, 0, sizeof(job)); - pre = NULL; - next = NULL; -} - -// 创建并返回一个空的带头结点的双向链表 -employee_list employee_makeEmpty() -{ - employee_list head = new employee; - return head; -} - -// 工号的精确查找,返回表中id的位置,若找不到则返回NULL -employee_list employee_findId(employee_list listHead, int value) -{ - employee_list p = listHead->next; - 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->next; - while (p != NULL) - { - if (strcmp(p->name, value) == 0) - break; - p = p->next; - } - return p; -} - -// 查找功能 1--ID查找 2--姓名查找 -employee_list employee_find(employee_list head) -{ - int num,id; - employee_list p; - char name[30]; - scanf("%d", &num); - if (num == 1) - { - printf("请输入工号:\n"); - scanf("%d", &id); - p = employee_findId(head, id); - return p; - } - if (num == 2) - { - printf("请输入姓名:\n"); - scanf("%s", name); - p = employee_findName(head, name); - 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); - system("cls"); - printf("员工性别:\n"); - scanf("%s", str); - strcpy(s->sex, str); - system("cls"); - printf("员工电话:\n"); - scanf("%s", str); - strcpy(s->phone, str); - system("cls"); - printf("所在部门:\n"); - scanf("%s", str); - strcpy(s->department, str); - system("cls"); - printf("职务:\n"); - scanf("%s", str); - strcpy(s->job, str); - system("cls"); - printf("员工工号:\n"); - scanf("%d", &s1); - s->id = s1; - system("cls"); - printf("基本工资:\n"); - scanf("%d", &s1); - s->basic_salary = s1; - system("cls"); - s->absentDays = 0; - s->salary = 0; - system("cls"); - s->next = position->next; // 修改新增结点后继指针 - position->next = s; // 修改position的后继指针 - if (s->next != NULL) // s不是链表尾节点 - s->next->pre = s; // 修改新增结点下一结点的前驱指针 - s->pre = position; // 修改新增结点前驱指针 - - // 在这个函数里没有给新增的结点赋值 - // 请在调用完该函数之后,给新增结点的每一项挨个赋值 - // 新增结点的指针就是“该函数的参数->next” - - return true; -} - -// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 -employee_list employee_addNode(employee_list listHead) -{ - employee_insertNode(listHead); - return listHead->next; -} - -// 将position指向的元素删除并返回true。若position指向非法位置,返回false -bool employee_deleteNode(employee_list position) -{ - // 第一,如果position指向非法位置(如NULL),此时返回false - // 第二,不能直接删除头结点,如需删除空链表请使用deleteLinkList函数 - if (position == NULL || position->pre == NULL) - { - return false; - } - position->pre->next = position->next; // 断开position与前一个的联系 - if (position->next != NULL) // position不是链表尾节点 - position->next->pre = position->pre; // 断开position与后一个的联系 - delete position; - position = NULL; - - return true; -} - - - -// 释放链表所占空间(释放全部结点) -void employee_deleteLinkList(employee_list listHead) -{ - employee *p = listHead; - while (p->next != NULL) // 依次释放链表结点所占空间 - { - p = p->next; - delete p->pre; - } - delete p; - return; -} - -// 从文件读入已有信息 -bool employee_inputFromFile(employee_list listHead) -{ - puts("请输入文件名或文件的地址,以回车结束。注意:地址中的'\\'应写作\"\\\\\"。"); - char fileName[200]; // 文件名或地址 - scanf("%[^\n]", fileName); - fflush(stdin); - FILE *fp = fopen(fileName, "r"); - if (fp == NULL) // 未打开成功 - { - puts("无法打开指定的文件,请重试。"); - system("pause"); - return false; - } - char temp[500]; // 假定一条数据的最大长度为500个字符 - int cnt = 0; // 记录读入数据条数 - while (fgets(temp, 500, fp) != NULL) - { - employee *s = employee_addNode(listHead); - sscanf(temp, "%d\t%s\t%s\t%s\t%d\t%d\t%s\t%s", - &s->id, s->name, s->sex, s->phone, - &s->basic_salary, &s->absentDays, - s->department, s->job); - cnt++; - } - if (cnt != 0) - { - printf("成功读入 %d 条数据。", cnt); - } - else - { - printf("未能成功读取数据,请检查文件 %s 是否为空。\n", fileName); - } - fclose(fp); - system("pause"); - return true; -} - -// 计算并打印员工工资 -int employee_countSalary(employee_list listHead,sales_Records re) -{ - employee_list p = listHead->next; - sales_Records q = re; - char input; - bool flag; - printf("姓名 工号 性别 电话 基本工资 工资 缺勤天数 部门 职务"); - while (p != NULL) - { - p->salary = p->basic_salary; - if (p->absentDays > 2) - { - p->salary -= p->absentDays * 50; // 计算缺勤天数应该扣的钱 - } - while (q != NULL) - { - if (strcmp(p->name, q->people) == 0) - { - p->salary += q->count*q->price*0.05; // 提成销售额的5% - } - q = q->next; - } - printf("%s %d %s %s %d %.2lf %d %s %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)"); - scanf("%c", &input); - if(input=='y') - { - return 1; - } - else - { - return 0; - } -} - -// 将员工信息输出到文件 -bool employee_printIntoFile(employee_list listHead) -{ - employee_list p = listHead->next; - if (p->next == NULL) - { - puts("\n当前系统中暂无记录,请输入信息后再尝试保存\n"); - system("pause"); - return false; - } - puts("请输入文件名,以回车结束"); - char filename[20]; - scanf("%[^\n]", filename); - FILE *fp = fopen(filename, "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", 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条数据到%s", num, filename); - fclose(fp); - system("pause"); - return true; -} - -- Gitee From 91caa25e72ae1587d5d98167fcec620a19a99697 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Thu, 16 Jul 2020 13:14:25 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20em?= =?UTF-8?q?ployee.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- employee.h | 71 ------------------------------------------------------ 1 file changed, 71 deletions(-) delete mode 100644 employee.h diff --git a/employee.h b/employee.h deleted file mode 100644 index a9acda7..0000000 --- a/employee.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __EMPLOYEE_H__ -#define __EMPLOYEE_H__ - -// 标准头文件结构 - -// 员工信息结点的数据结构(双向链表) -struct employee { - int id; // 工号 - char name[10]; // 姓名 - char sex[5]; // 性别 - char phone[15]; // 电话 - int basic_salary; // 基本工资 - double salary; //工资 - int absentDays; // 缺勤的天数 - char department[30]; // 部门 - char job[30]; // 职务 - struct employee *pre; // 前趋指针 - struct employee *next; // 后继指针 - employee(); // 构造函数,用于新建结点时初始化内容 -}; - -struct records -{ - int id; - char goodName[20]; - char people[20]; // 销售员 - int count; // 销售数量 - double price; // 销售金额 - int year; - int mon; - int hour; - int min; - int sec; - records * next; -}; - -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); - -// 将员工信息输出到文件 -bool employee_printIntoFile(employee_list listHead); - -#endif -- Gitee From deed787c1ca761b2f379fea84be4ce9018c389e9 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Thu, 16 Jul 2020 13:14:39 +0800 Subject: [PATCH 07/17] =?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 | 71 ------------------------------------------------- 1 file changed, 71 deletions(-) delete mode 100644 code/employee.h diff --git a/code/employee.h b/code/employee.h deleted file mode 100644 index a9acda7..0000000 --- a/code/employee.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __EMPLOYEE_H__ -#define __EMPLOYEE_H__ - -// 标准头文件结构 - -// 员工信息结点的数据结构(双向链表) -struct employee { - int id; // 工号 - char name[10]; // 姓名 - char sex[5]; // 性别 - char phone[15]; // 电话 - int basic_salary; // 基本工资 - double salary; //工资 - int absentDays; // 缺勤的天数 - char department[30]; // 部门 - char job[30]; // 职务 - struct employee *pre; // 前趋指针 - struct employee *next; // 后继指针 - employee(); // 构造函数,用于新建结点时初始化内容 -}; - -struct records -{ - int id; - char goodName[20]; - char people[20]; // 销售员 - int count; // 销售数量 - double price; // 销售金额 - int year; - int mon; - int hour; - int min; - int sec; - records * next; -}; - -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); - -// 将员工信息输出到文件 -bool employee_printIntoFile(employee_list listHead); - -#endif -- Gitee From 3391125388728c122ea85252661e2799af785e84 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Thu, 16 Jul 2020 13:15:27 +0800 Subject: [PATCH 08/17] =?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 | 336 ---------------------------------------------- 1 file changed, 336 deletions(-) delete mode 100644 code/employee.cpp diff --git a/code/employee.cpp b/code/employee.cpp deleted file mode 100644 index 8039508..0000000 --- a/code/employee.cpp +++ /dev/null @@ -1,336 +0,0 @@ -#include -#include -#include -#include "employee.h" - -int employee_main() -{ - employee_list employee_List = employee_makeEmpty(),p; - sales_Records all; - bool flag; - printf("欢迎使用员工信息管理!\n"); - int num; - printf("*******请输入要执行的功能:*******\n"); - printf("****** 1----增加员工信息 *********\n"); - printf("****** 2----查找员工信息 *********\n"); - printf("****** 3----删除员工信息 *********\n"); - printf("****** 4----统计员工工资 *********\n"); - printf("********* 0----退出系统 **********\n"); - scanf("%d", &num); - while (num != 0) - { - switch (num) - { - case 0:return 0; - case 1: - { - employee_List = employee_addNode(employee_List); - } - case 2: - { - p = employee_find(employee_List); - printf("姓名:%s\n 工号:%d\n 性别:%s\n 电话:%s\n 基本工资:%d\n 工资:%.2lf\n 缺勤天数:%d\n 部门:%s\n 职务:%s\n", p->name, p->id, p->sex, p->phone, p->basic_salary, p->salary, p->absentDays, p->department, p->job); - } - case 3: - { - p = employee_find(employee_List); - flag = employee_deleteNode(p); - if (flag == true) - { - printf("删除成功"); - } - else - { - printf("删除失败,请重试"); - } - } - case 4: - { - if (employee_countSalary(employee_List, all) == 1) - { - employee_printIntoFile(employee_List); - } - } - } - system("cls"); - printf("*******请输入要执行的功能:*******\n"); - scanf("%d", &num); - system("cls"); - } - return 0; -} - -employee::employee() -{ - // 将结构体中所有成员都置为空 - id = 0; - memset(name, 0, sizeof(name)); - memset(sex, 0, sizeof(sex)); - memset(phone, 0, sizeof(phone)); - basic_salary = 0; - absentDays = 0; - memset(department, 0, sizeof(department)); - memset(job, 0, sizeof(job)); - pre = NULL; - next = NULL; -} - -// 创建并返回一个空的带头结点的双向链表 -employee_list employee_makeEmpty() -{ - employee_list head = new employee; - return head; -} - -// 工号的精确查找,返回表中id的位置,若找不到则返回NULL -employee_list employee_findId(employee_list listHead, int value) -{ - employee_list p = listHead->next; - 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->next; - while (p != NULL) - { - if (strcmp(p->name, value) == 0) - break; - p = p->next; - } - return p; -} - -// 查找功能 1--ID查找 2--姓名查找 -employee_list employee_find(employee_list head) -{ - int num,id; - employee_list p; - char name[30]; - scanf("%d", &num); - if (num == 1) - { - printf("请输入工号:\n"); - scanf("%d", &id); - p = employee_findId(head, id); - return p; - } - if (num == 2) - { - printf("请输入姓名:\n"); - scanf("%s", name); - p = employee_findName(head, name); - 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); - system("cls"); - printf("员工性别:\n"); - scanf("%s", str); - strcpy(s->sex, str); - system("cls"); - printf("员工电话:\n"); - scanf("%s", str); - strcpy(s->phone, str); - system("cls"); - printf("所在部门:\n"); - scanf("%s", str); - strcpy(s->department, str); - system("cls"); - printf("职务:\n"); - scanf("%s", str); - strcpy(s->job, str); - system("cls"); - printf("员工工号:\n"); - scanf("%d", &s1); - s->id = s1; - system("cls"); - printf("基本工资:\n"); - scanf("%d", &s1); - s->basic_salary = s1; - system("cls"); - s->absentDays = 0; - s->salary = 0; - system("cls"); - s->next = position->next; // 修改新增结点后继指针 - position->next = s; // 修改position的后继指针 - if (s->next != NULL) // s不是链表尾节点 - s->next->pre = s; // 修改新增结点下一结点的前驱指针 - s->pre = position; // 修改新增结点前驱指针 - - // 在这个函数里没有给新增的结点赋值 - // 请在调用完该函数之后,给新增结点的每一项挨个赋值 - // 新增结点的指针就是“该函数的参数->next” - - return true; -} - -// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 -employee_list employee_addNode(employee_list listHead) -{ - employee_insertNode(listHead); - return listHead->next; -} - -// 将position指向的元素删除并返回true。若position指向非法位置,返回false -bool employee_deleteNode(employee_list position) -{ - // 第一,如果position指向非法位置(如NULL),此时返回false - // 第二,不能直接删除头结点,如需删除空链表请使用deleteLinkList函数 - if (position == NULL || position->pre == NULL) - { - return false; - } - position->pre->next = position->next; // 断开position与前一个的联系 - if (position->next != NULL) // position不是链表尾节点 - position->next->pre = position->pre; // 断开position与后一个的联系 - delete position; - position = NULL; - - return true; -} - - - -// 释放链表所占空间(释放全部结点) -void employee_deleteLinkList(employee_list listHead) -{ - employee *p = listHead; - while (p->next != NULL) // 依次释放链表结点所占空间 - { - p = p->next; - delete p->pre; - } - delete p; - return; -} - -// 从文件读入已有信息 -bool employee_inputFromFile(employee_list listHead) -{ - puts("请输入文件名或文件的地址,以回车结束。注意:地址中的'\\'应写作\"\\\\\"。"); - char fileName[200]; // 文件名或地址 - scanf("%[^\n]", fileName); - fflush(stdin); - FILE *fp = fopen(fileName, "r"); - if (fp == NULL) // 未打开成功 - { - puts("无法打开指定的文件,请重试。"); - system("pause"); - return false; - } - char temp[500]; // 假定一条数据的最大长度为500个字符 - int cnt = 0; // 记录读入数据条数 - while (fgets(temp, 500, fp) != NULL) - { - employee *s = employee_addNode(listHead); - sscanf(temp, "%d\t%s\t%s\t%s\t%d\t%d\t%s\t%s", - &s->id, s->name, s->sex, s->phone, - &s->basic_salary, &s->absentDays, - s->department, s->job); - cnt++; - } - if (cnt != 0) - { - printf("成功读入 %d 条数据。", cnt); - } - else - { - printf("未能成功读取数据,请检查文件 %s 是否为空。\n", fileName); - } - fclose(fp); - system("pause"); - return true; -} - -// 计算并打印员工工资 -int employee_countSalary(employee_list listHead,sales_Records re) -{ - employee_list p = listHead->next; - sales_Records q = re; - char input; - bool flag; - printf("姓名 工号 性别 电话 基本工资 工资 缺勤天数 部门 职务"); - while (p != NULL) - { - p->salary = p->basic_salary; - if (p->absentDays > 2) - { - p->salary -= p->absentDays * 50; // 计算缺勤天数应该扣的钱 - } - while (q != NULL) - { - if (strcmp(p->name, q->people) == 0) - { - p->salary += q->count*q->price*0.05; // 提成销售额的5% - } - q = q->next; - } - printf("%s %d %s %s %d %.2lf %d %s %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)"); - scanf("%c", &input); - if(input=='y') - { - return 1; - } - else - { - return 0; - } -} - -// 将员工信息输出到文件 -bool employee_printIntoFile(employee_list listHead) -{ - employee_list p = listHead->next; - if (p->next == NULL) - { - puts("\n当前系统中暂无记录,请输入信息后再尝试保存\n"); - system("pause"); - return false; - } - puts("请输入文件名,以回车结束"); - char filename[20]; - scanf("%[^\n]", filename); - FILE *fp = fopen(filename, "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", 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条数据到%s", num, filename); - fclose(fp); - system("pause"); - return true; -} - -- Gitee From cbcb09a09f0f58aeddeb61900a13c601d8bba683 Mon Sep 17 00:00:00 2001 From: Shanbingzhen Date: Thu, 16 Jul 2020 13:16:09 +0800 Subject: [PATCH 09/17] =?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=81v2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/employee.cpp | 379 +++++++++++++++++++++++++++++++++++++++++++ code/employee.h | 78 +++++++++ code/information.txt | 3 + 3 files changed, 460 insertions(+) create mode 100644 code/employee.cpp create mode 100644 code/employee.h create mode 100644 code/information.txt diff --git a/code/employee.cpp b/code/employee.cpp new file mode 100644 index 0000000..ef6775e --- /dev/null +++ b/code/employee.cpp @@ -0,0 +1,379 @@ +#include +#include +#include +#include +#include "employee.h" + +int main() +{ + employee_list employee_List = employee_makeEmpty(), p; + sales_Records all; + bool flag; + printf("欢迎使用员工信息管理!\n"); + char num; + employee_meau(); + num = getch(); + system("cls"); + while (num != 0) + { + switch (num) + { + case '0':return 0; + case '1': + { + char n; + printf("1--从文件读取 2--手动添加\n"); + n = getch(); + if (n == '1') + { + employee_inputFromFile(employee_List); + } + else + { + employee_List = employee_addNode(employee_List); + } + break; + } + case '2': + { + p = employee_find(employee_List); + 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("未找到相关信息,请重试"); + } + system("pause"); + break; + } + case '3': + { + flag = employee_deleteNode(employee_List); + if (flag == true) + { + printf("删除成功"); + system("pause"); + employee_printIntoFile(employee_List); + } + else + { + printf("删除失败,请重试"); + } + break; + } + case '4': + { + if (employee_countSalary(employee_List, all) == 1) + { + employee_printIntoFile(employee_List); + } + break; + } + } + system("cls"); + employee_meau(); + printf("*******请输入要执行的功能:*******\n"); + num = getch(); + system("cls"); + } + return 0; +} + +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() +{ + printf("*******请输入要执行的功能:*******\n"); + printf("****** 1----增加员工信息 *********\n"); + printf("****** 2----查找员工信息 *********\n"); + printf("****** 3----删除员工信息 *********\n"); + printf("****** 4----统计员工工资 *********\n"); + printf("********* 0----退出系统 **********\n"); +} + +// 创建并返回一个空的带头结点的双向链表 +employee_list employee_makeEmpty() +{ + employee_list head = new employee; + return head; +} + +// 查找功能 1--ID查找 2--姓名查找 +employee_list employee_find(employee_list head) +{ + int id; + char num; + printf("1--ID查找 2--姓名查找\n"); + employee_list p; + char name[30]; + num = getch(); + if (num == '1') + { + printf("请输入工号:\n"); + scanf("%d", &id); + p = employee_findId(head, id); + return p; + } + if (num == '2') + { + printf("请输入姓名:\n"); + scanf("%s", name); + p = employee_findName(head, name); + return p; + } +} + +// 工号的精确查找,返回表中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; // 修改新增结点前驱指针 + + // 在这个函数里没有给新增的结点赋值 + // 请在调用完该函数之后,给新增结点的每一项挨个赋值 + // 新增结点的指针就是“该函数的参数->next” + + return true; +} + +// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 +employee_list employee_addNode(employee_list listHead) +{ + employee_insertNode(listHead); + return listHead; +} + +// 将position指向的元素删除并返回true。若position指向非法位置,返回false +bool employee_deleteNode(employee_list listHead) +{ + // 第一,如果position指向非法位置(如NULL),此时返回false + // 第二,不能直接删除头结点,如需删除空链表请使用deleteLinkList函数 + /*if (position == NULL || position->pre == NULL) + { + return false; + } + position->pre->next = position->next; // 断开position与前一个的联系 + if (position->next != NULL) // position不是链表尾节点 + position->next->pre = position->pre; // 断开position与后一个的联系 + delete position; + position = NULL; + */ + int id; + printf("请输入工号:"); + scanf("%d", &id); + employee_list p = listHead, q = listHead->next; + while (q!=NULL) + { + if (q->id == id) + { + p->next = q->next; + free(q); + return true; + } + p = p->next; + q = q->next; + } + return false; +} + + + +// 释放链表所占空间(释放全部结点) +void employee_deleteLinkList(employee_list listHead) +{ + employee *p = listHead; + while (p->next != NULL) // 依次释放链表结点所占空间 + { + p = p->next; + delete p->pre; + } + delete p; + return; +} + +// 从文件读入已有信息 +bool employee_inputFromFile(employee_list listHead) +{ + puts("请输入文件名或文件的地址,以回车结束。注意:地址中的'\\'应写作\"\\\\\"。"); + char fileName[200]; // 文件名或地址 + scanf("%[^\n]", fileName); + fflush(stdin); + FILE *fp = fopen(fileName, "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 条数据。", cnt); + } + else + { + printf("未能成功读取数据,请检查文件 %s 是否为空。\n", fileName); + } + fclose(fp); + system("pause"); + return true; +} + +// 计算并打印员工工资 +int employee_countSalary(employee_list listHead, sales_Records re) +{ + employee_list p = listHead->next; + sales_Records q = re; + char input; + bool flag; + printf("姓名 工号 性别 电话 基本工资 工资 缺勤天数 部门 职务"); + while (p != NULL) + { + double price = 0; + p->salary = p->basic_salary; + if (p->absentDays > 2) + { + p->salary -= p->absentDays * 50; // 计算缺勤天数应该扣的钱 + } + while (q != NULL) + { + if (strcmp(p->name, q->people) == 0) + { + price += q->price; + } + q = q->next; + } + p->old_price += price; + p->salary += q->count*q->price*0.05; // 提成销售额的5% + printf("%s %d %s %s %d %.2lf %d %s %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)"); + scanf("%c", &input); + if (input == 'y') + { + return 1; + } + else + { + return 0; + } +} + +// 将员工信息输出到文件 +void employee_printIntoFile(employee_list listHead) +{ + employee_list p = listHead->next; + if (p->next == NULL) + { + puts("\n当前系统中暂无记录,请输入信息后再尝试保存\n"); + system("pause"); + } + FILE *fp = fopen("employ.txt", "w"); + if (fp == NULL) + { + puts("无法打开指定文件"); + system("pause"); + } + 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", 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条数据到employee.txt中", num); + fclose(fp); + system("pause"); +} + diff --git a/code/employee.h b/code/employee.h new file mode 100644 index 0000000..f43e6f1 --- /dev/null +++ b/code/employee.h @@ -0,0 +1,78 @@ +#ifndef __EMPLOYEE_H__ +#define __EMPLOYEE_H__ + +// 标准头文件结构 + +// 员工信息结点的数据结构(双向链表) +struct employee { + int id; // 工号 + char name[10]; // 姓名 + char sex[5]; // 性别 + char phone[15]; // 电话 + int basic_salary; // 基本工资 + double salary; //工资 + double old_price; // 历史销售额 + int absentDays; // 缺勤的天数 + char department[30]; // 部门 + char job[30]; // 职务 + struct employee *pre; // 前趋指针 + struct employee *next; // 后继指针 + employee(); // 构造函数,用于新建结点时初始化内容 +}; + +struct records +{ + int id; + char goodName[20]; + char people[20]; // 销售员 + int count; // 销售数量 + double price; // 销售金额 + int year; + int mon; + int hour; + int min; + int sec; + records * next; +}; + +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--姓名查找 +employee_list employee_find(employee_list head); + +// 菜单 +void employee_meau(); + +#endif diff --git a/code/information.txt b/code/information.txt new file mode 100644 index 0000000..7f5a056 --- /dev/null +++ b/code/information.txt @@ -0,0 +1,3 @@ +101 zhangsan M 13122220000 3000 5 SalesDepartment salesperson +102 lisi M 13255555555 3500 1 SalesDepartment salesperson +103 wangwu F 13333333333 3200 2 Division assistant \ No newline at end of file -- Gitee From 5dffce6e8b6bf79f6ea0f28e96d857faac73aac5 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Fri, 17 Jul 2020 20:09:03 +0800 Subject: [PATCH 10/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/repo.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/repo.h | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 code/repo.h diff --git a/code/repo.h b/code/repo.h deleted file mode 100644 index a507af6..0000000 --- a/code/repo.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __REPO_H__ -#define __REPO_H__ - -// 标准头文件结构。 - - - -#endif -- Gitee From 2d64918f4b7921bece4577d5ca6bdd963aad5451 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Fri, 17 Jul 2020 20:09:09 +0800 Subject: [PATCH 11/17] =?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 | 78 ------------------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 code/employee.h diff --git a/code/employee.h b/code/employee.h deleted file mode 100644 index f43e6f1..0000000 --- a/code/employee.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef __EMPLOYEE_H__ -#define __EMPLOYEE_H__ - -// 标准头文件结构 - -// 员工信息结点的数据结构(双向链表) -struct employee { - int id; // 工号 - char name[10]; // 姓名 - char sex[5]; // 性别 - char phone[15]; // 电话 - int basic_salary; // 基本工资 - double salary; //工资 - double old_price; // 历史销售额 - int absentDays; // 缺勤的天数 - char department[30]; // 部门 - char job[30]; // 职务 - struct employee *pre; // 前趋指针 - struct employee *next; // 后继指针 - employee(); // 构造函数,用于新建结点时初始化内容 -}; - -struct records -{ - int id; - char goodName[20]; - char people[20]; // 销售员 - int count; // 销售数量 - double price; // 销售金额 - int year; - int mon; - int hour; - int min; - int sec; - records * next; -}; - -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--姓名查找 -employee_list employee_find(employee_list head); - -// 菜单 -void employee_meau(); - -#endif -- Gitee From 4e28cb6f236fb52ef9f8363c42dc1397242bc7b0 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Fri, 17 Jul 2020 20:09:14 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/date.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/date.h | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 code/date.h diff --git a/code/date.h b/code/date.h deleted file mode 100644 index afc0acd..0000000 --- a/code/date.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __DATE_H__ -#define __DATE_H__ - -struct date -{ - int year; // 年 - int month; // 月 - int day; // 日 - date(); // 默认构造函数,年月日均初始化为0 - date(int y, int m, int d); // 根据参数 y,m,d 初始化年月日 - date(const date &_date); // 拷贝构造函数 - friend bool operator>(const date &a, const date &b); - // 重载大于号,判断日期a是否大于日期b -}; - -// 返回日期a + 天数b的结果 -date addDay(date d, int days); - -#endif // !__DATE_H__ -- Gitee From fa724dea97001851283c04b1c5ac117302bcd1d4 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Fri, 17 Jul 2020 20:09:19 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/date.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/date.cpp | 85 --------------------------------------------------- 1 file changed, 85 deletions(-) delete mode 100644 code/date.cpp diff --git a/code/date.cpp b/code/date.cpp deleted file mode 100644 index 0ebd7f3..0000000 --- a/code/date.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "date.h" - -date::date() :year(0), month(0), day(0) {} - -date::date(int y, int m, int d) : - year(y), month(m), day(d) {} - -// 拷贝构造函数 -date::date(const date &_date) : - year(_date.year), month(_date.month), day(_date.day) {} - -// 重载大于号,判断日期a是否大于日期b -/*********************************************** - * addDate -- 返回日期a + 天数b的结果 - * 参数:d:日期结构体(年月日) - * days:要加的天数 - * 返回值:计算结果,类型为日期(年月日) - ***********************************************/ -bool operator>(const date &a, const date &b) -{ - if(a.year != b.year) - return a.year > b.year; - if(a.month != b.month) - return a.month > b.month; - return a.day > b.day; -} - -/*********************************************** - * addDate -- 返回日期a + 天数b的结果 - * 参数:d:日期结构体(年月日) - * days:要加的天数 - * 返回值:计算结果,类型为日期(年月日) - ***********************************************/ -date addDay(date d, int days) -{ - for(int i = days; i != 0; --i) // 模拟每一天的增加 - { - if(d.day == 31) // 对31日的处理 - { - if(d.month != 12) // 不是12月31日 - { - d.month++; - d.day = 1; - } - else // 是12月31日 - { - d.year++; - d.month = 1; - d.day = 1; - } - continue; - } - if(d.day == 30) // 对30日的处理 - { - // 4、6、9、11月只有30天,下一天是新的月份 - if(d.month == 4 || d.month == 6 || d.month == 9 || d.month == 11) - { - d.month++; - d.day = 1; - } - else // 不用更改月份,直接下一天 - d.day++; - continue; - } - if(d.day == 29 && d.month == 2) // 闰年的2月最后一天 - { - d.month++; - d.day = 1; - continue; - } - if(d.day == 28 && d.month == 2) // 2月28日 - { - if(((d.year % 4 == 0) && (d.year % 100 != 0)) || (d.year % 400 == 0)) - d.day++; // 如果是闰年,日期+1 - else - { - d.month++; // 如果是平年,则是下个月的第一天 - d.day = 1; - } - continue; - } - d.day++; // 其他情况,直接下一天 - } - return d; -} -- Gitee From eff14478c4bc0cbd732c5b616fd0da805b37367e Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Fri, 17 Jul 2020 20:09:24 +0800 Subject: [PATCH 14/17] =?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 | 379 ---------------------------------------------- 1 file changed, 379 deletions(-) delete mode 100644 code/employee.cpp diff --git a/code/employee.cpp b/code/employee.cpp deleted file mode 100644 index ef6775e..0000000 --- a/code/employee.cpp +++ /dev/null @@ -1,379 +0,0 @@ -#include -#include -#include -#include -#include "employee.h" - -int main() -{ - employee_list employee_List = employee_makeEmpty(), p; - sales_Records all; - bool flag; - printf("欢迎使用员工信息管理!\n"); - char num; - employee_meau(); - num = getch(); - system("cls"); - while (num != 0) - { - switch (num) - { - case '0':return 0; - case '1': - { - char n; - printf("1--从文件读取 2--手动添加\n"); - n = getch(); - if (n == '1') - { - employee_inputFromFile(employee_List); - } - else - { - employee_List = employee_addNode(employee_List); - } - break; - } - case '2': - { - p = employee_find(employee_List); - 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("未找到相关信息,请重试"); - } - system("pause"); - break; - } - case '3': - { - flag = employee_deleteNode(employee_List); - if (flag == true) - { - printf("删除成功"); - system("pause"); - employee_printIntoFile(employee_List); - } - else - { - printf("删除失败,请重试"); - } - break; - } - case '4': - { - if (employee_countSalary(employee_List, all) == 1) - { - employee_printIntoFile(employee_List); - } - break; - } - } - system("cls"); - employee_meau(); - printf("*******请输入要执行的功能:*******\n"); - num = getch(); - system("cls"); - } - return 0; -} - -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() -{ - printf("*******请输入要执行的功能:*******\n"); - printf("****** 1----增加员工信息 *********\n"); - printf("****** 2----查找员工信息 *********\n"); - printf("****** 3----删除员工信息 *********\n"); - printf("****** 4----统计员工工资 *********\n"); - printf("********* 0----退出系统 **********\n"); -} - -// 创建并返回一个空的带头结点的双向链表 -employee_list employee_makeEmpty() -{ - employee_list head = new employee; - return head; -} - -// 查找功能 1--ID查找 2--姓名查找 -employee_list employee_find(employee_list head) -{ - int id; - char num; - printf("1--ID查找 2--姓名查找\n"); - employee_list p; - char name[30]; - num = getch(); - if (num == '1') - { - printf("请输入工号:\n"); - scanf("%d", &id); - p = employee_findId(head, id); - return p; - } - if (num == '2') - { - printf("请输入姓名:\n"); - scanf("%s", name); - p = employee_findName(head, name); - return p; - } -} - -// 工号的精确查找,返回表中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; // 修改新增结点前驱指针 - - // 在这个函数里没有给新增的结点赋值 - // 请在调用完该函数之后,给新增结点的每一项挨个赋值 - // 新增结点的指针就是“该函数的参数->next” - - return true; -} - -// 使用头插法,在链表头部新增一个结点,返回新增结点的指针 -employee_list employee_addNode(employee_list listHead) -{ - employee_insertNode(listHead); - return listHead; -} - -// 将position指向的元素删除并返回true。若position指向非法位置,返回false -bool employee_deleteNode(employee_list listHead) -{ - // 第一,如果position指向非法位置(如NULL),此时返回false - // 第二,不能直接删除头结点,如需删除空链表请使用deleteLinkList函数 - /*if (position == NULL || position->pre == NULL) - { - return false; - } - position->pre->next = position->next; // 断开position与前一个的联系 - if (position->next != NULL) // position不是链表尾节点 - position->next->pre = position->pre; // 断开position与后一个的联系 - delete position; - position = NULL; - */ - int id; - printf("请输入工号:"); - scanf("%d", &id); - employee_list p = listHead, q = listHead->next; - while (q!=NULL) - { - if (q->id == id) - { - p->next = q->next; - free(q); - return true; - } - p = p->next; - q = q->next; - } - return false; -} - - - -// 释放链表所占空间(释放全部结点) -void employee_deleteLinkList(employee_list listHead) -{ - employee *p = listHead; - while (p->next != NULL) // 依次释放链表结点所占空间 - { - p = p->next; - delete p->pre; - } - delete p; - return; -} - -// 从文件读入已有信息 -bool employee_inputFromFile(employee_list listHead) -{ - puts("请输入文件名或文件的地址,以回车结束。注意:地址中的'\\'应写作\"\\\\\"。"); - char fileName[200]; // 文件名或地址 - scanf("%[^\n]", fileName); - fflush(stdin); - FILE *fp = fopen(fileName, "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 条数据。", cnt); - } - else - { - printf("未能成功读取数据,请检查文件 %s 是否为空。\n", fileName); - } - fclose(fp); - system("pause"); - return true; -} - -// 计算并打印员工工资 -int employee_countSalary(employee_list listHead, sales_Records re) -{ - employee_list p = listHead->next; - sales_Records q = re; - char input; - bool flag; - printf("姓名 工号 性别 电话 基本工资 工资 缺勤天数 部门 职务"); - while (p != NULL) - { - double price = 0; - p->salary = p->basic_salary; - if (p->absentDays > 2) - { - p->salary -= p->absentDays * 50; // 计算缺勤天数应该扣的钱 - } - while (q != NULL) - { - if (strcmp(p->name, q->people) == 0) - { - price += q->price; - } - q = q->next; - } - p->old_price += price; - p->salary += q->count*q->price*0.05; // 提成销售额的5% - printf("%s %d %s %s %d %.2lf %d %s %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)"); - scanf("%c", &input); - if (input == 'y') - { - return 1; - } - else - { - return 0; - } -} - -// 将员工信息输出到文件 -void employee_printIntoFile(employee_list listHead) -{ - employee_list p = listHead->next; - if (p->next == NULL) - { - puts("\n当前系统中暂无记录,请输入信息后再尝试保存\n"); - system("pause"); - } - FILE *fp = fopen("employ.txt", "w"); - if (fp == NULL) - { - puts("无法打开指定文件"); - system("pause"); - } - 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", 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条数据到employee.txt中", num); - fclose(fp); - system("pause"); -} - -- Gitee From ae6610d2d89ee52878db6dd42000659031efa796 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Fri, 17 Jul 2020 20:09:28 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/information.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/information.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 code/information.txt diff --git a/code/information.txt b/code/information.txt deleted file mode 100644 index 7f5a056..0000000 --- a/code/information.txt +++ /dev/null @@ -1,3 +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 \ No newline at end of file -- Gitee From 22c6cf81d34eb9f24203f72c31d2ba8534b3d1c0 Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Fri, 17 Jul 2020 20:09:33 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?de/repo.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/repo.cpp | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 code/repo.cpp diff --git a/code/repo.cpp b/code/repo.cpp deleted file mode 100644 index 9cf68bd..0000000 --- a/code/repo.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "repo.h" - -// 查询商品信息结构体中是否有剩余货 - -// 卖出货后减去相应数量 - -- Gitee From 714c6c69e6f6665a0fbb7626589ef9166d7da6fe Mon Sep 17 00:00:00 2001 From: hyp19991114 Date: Fri, 17 Jul 2020 20:10:28 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E9=9B=86=E6=88=90=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/date.cpp | 86 +++++++++ code/date.h | 19 ++ code/employee.cpp | 392 +++++++++++++++++++++++++++++++++++++++++ code/employee.h | 68 +++++++ code/employee_info.txt | 5 + code/main.cpp | 78 ++++++++ code/repo.cpp | 365 ++++++++++++++++++++++++++++++++++++++ code/repo.h | 34 ++++ 8 files changed, 1047 insertions(+) create mode 100644 code/date.cpp create mode 100644 code/date.h create mode 100644 code/employee.cpp create mode 100644 code/employee.h create mode 100644 code/employee_info.txt create mode 100644 code/main.cpp create mode 100644 code/repo.cpp create mode 100644 code/repo.h diff --git a/code/date.cpp b/code/date.cpp new file mode 100644 index 0000000..9c52131 --- /dev/null +++ b/code/date.cpp @@ -0,0 +1,86 @@ +#include "date.h" + +// 无参构造函数 +date::date() :year(0), month(0), day(0) {} + +// 带参构造函数 +date::date(int y, int m, int d) : + year(y), month(m), day(d) {} + +// 拷贝构造函数 +date::date(const date &_date) : + year(_date.year), month(_date.month), day(_date.day) {} + +/**************************************************** + * operator> -- 重载大于号,判断日期a是否大于日期b + * 参数:a,b:都是日期结构体(年月日) + * 返回值:若日期a大于日期b,返回true + * 否则返回false + ****************************************************/ +bool operator>(const date &a, const date &b) +{ + if(a.year != b.year) + return a.year > b.year; + if(a.month != b.month) + return a.month > b.month; + return a.day > b.day; +} + +/*********************************************** + * addDay -- 返回日期a + 天数b的结果 + * 参数:d:日期结构体(年月日) + * days:要加的天数 + * 返回值:计算结果,类型为日期(年月日) + ***********************************************/ +date addDay(date d, int days) +{ + for(int i = days; i != 0; --i) // 模拟每一天的增加 + { + if(d.day == 31) // 对31日的处理 + { + if(d.month != 12) // 不是12月31日 + { + d.month++; + d.day = 1; + } + else // 是12月31日 + { + d.year++; + d.month = 1; + d.day = 1; + } + continue; + } + if(d.day == 30) // 对30日的处理 + { + // 4、6、9、11月只有30天,下一天是新的月份 + if(d.month == 4 || d.month == 6 || d.month == 9 || d.month == 11) + { + d.month++; + d.day = 1; + } + else // 不用更改月份,直接下一天 + d.day++; + continue; + } + if(d.day == 29 && d.month == 2) // 闰年的2月最后一天 + { + d.month++; + d.day = 1; + continue; + } + if(d.day == 28 && d.month == 2) // 2月28日 + { + if(((d.year % 4 == 0) && (d.year % 100 != 0)) || (d.year % 400 == 0)) + d.day++; // 如果是闰年,日期+1 + else + { + d.month++; // 如果是平年,则是下个月的第一天 + d.day = 1; + } + continue; + } + d.day++; // 其他情况,直接下一天 + } + return d; +} diff --git a/code/date.h b/code/date.h new file mode 100644 index 0000000..afc0acd --- /dev/null +++ b/code/date.h @@ -0,0 +1,19 @@ +#ifndef __DATE_H__ +#define __DATE_H__ + +struct date +{ + int year; // 年 + int month; // 月 + int day; // 日 + date(); // 默认构造函数,年月日均初始化为0 + date(int y, int m, int d); // 根据参数 y,m,d 初始化年月日 + date(const date &_date); // 拷贝构造函数 + friend bool operator>(const date &a, const date &b); + // 重载大于号,判断日期a是否大于日期b +}; + +// 返回日期a + 天数b的结果 +date addDay(date d, int days); + +#endif // !__DATE_H__ diff --git a/code/employee.cpp b/code/employee.cpp new file mode 100644 index 0000000..ba9fd83 --- /dev/null +++ b/code/employee.cpp @@ -0,0 +1,392 @@ +#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; + sales_Records q; + char input; + bool flag; + printf("%-15s %-4s %-4s %-12s %-8s %-8s %-8s %-20s %s\n", + "姓名", "工号", "性别", "电话", "基本工资", "工资", "缺勤天数", "部门", "职务"); + while(p != 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 diff --git a/code/employee.h b/code/employee.h new file mode 100644 index 0000000..7cc304a --- /dev/null +++ b/code/employee.h @@ -0,0 +1,68 @@ +#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 diff --git a/code/employee_info.txt b/code/employee_info.txt new file mode 100644 index 0000000..3589bed --- /dev/null +++ b/code/employee_info.txt @@ -0,0 +1,5 @@ +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 diff --git a/code/main.cpp b/code/main.cpp new file mode 100644 index 0000000..ecaba54 --- /dev/null +++ b/code/main.cpp @@ -0,0 +1,78 @@ +#include +#include +#include +#include "employee.h" +#include "purchase.h" +#include "sellFun.h" +#include "repo.h" + +#ifndef __GUI__ // 用控制台(黑框)实现系统主界面 + +int main() +{ + InitList_suppliers(suppliers_head, suppliers_tail); + InitList_commodity(commodity_head, commodity_tail); + int choice; // choice 接收由用户输入的指令代码 + system("color fc"); + while(true) + { + system("cls"); // 清屏 + system("title 超市管理系统"); // 更改窗口标题 + puts(" * * * * * 超 市 管 理 系 统 * * * * *\n"); + puts(" 1 - 员工管理"); + puts(" 2 - 进货管理"); + puts(" 3 - 销售管理"); + puts(" 4 - 库存管理"); + puts("\n 0 - 退出系统\n"); + printf("请选择:"); + scanf("%d", &choice); getchar(); + switch(choice) + { + case 1: // 员工管理 + { + system("cls"); + system("title 超市管理系统 - 员工管理"); + employee_meau(); + break; + } + case 2: // 进货管理 + { + system("cls"); + system("title 超市管理系统 - 进货管理"); + Main_interface(commodity_head, commodity_tail, suppliers_head, suppliers_tail); + break; + } + case 3: // 销售管理 + { + system("cls"); + system("title 超市管理系统 - 销售管理"); + sellmain(); + break; + } + case 4: // 库存管理 + { + system("cls"); + system("title 超市管理系统 - 库存管理"); + repo_main(); + break; + } + case 0: // 退出系统 + { + return 0; + } + default: + { + puts("输入错误,请重新输入。"); + system("pause"); + break; + } + } + } + return 0; +} + +#else // 用图形用户界面(GUI)实现系统主界面 + + + +#endif // !__GUI__ diff --git a/code/repo.cpp b/code/repo.cpp new file mode 100644 index 0000000..aa31aea --- /dev/null +++ b/code/repo.cpp @@ -0,0 +1,365 @@ +#include "repo.h" + +/************************************************************ + * repo_printGoodsInfo -- 输出p所指向的商品信息 + * 参数:fp:文件指针,为stdout时表示输出到标准输出,即屏幕 + * p:指向某个库存商品的指针 + * 返回值:无 + ************************************************************/ +void repo_printGoodsInfo(FILE *fp, goods *p) +{ + fprintf(fp, "%-20s %-20s %8.2lf %8.2lf %04d-%02d-%02d %6d %04d-%02d-%02d %8d %s\n", + p->id_Number, // 商品编号 + p->goods_Name, // 商品名 + p->buy_Price, // 商品进价 + p->sell_Price, // 商品售价 + p->produce_Date.year, p->produce_Date.month, p->produce_Date.day, // 生产日期 + p->quality_Date, // 保质期 + p->purchase_Date.year, p->purchase_Date.month, p->purchase_Date.day, // 进货日期 + p->remain_Number, // 剩余数量 + p->place // 库存位置 + ); + return; +} + +/**************************************************** + * repo_showRepoInfo -- 库存查询 + * 参数:listHead:库存商品链表的头指针 + * 返回值:查询成功,返回true + * 查询失败,返回false + ****************************************************/ +bool repo_showRepoInfo(goods *listHead) +{ + system("title 库存管理 - 库存查询"); + if(listHead->next == NULL) // 库存为空 + { + printf("库存为空!\n"); // 输出提示信息 + system("pause"); + return false; + } + int count = 0; // 库存信息的条数 + goods *p = listHead->next; + while(p != NULL) + { + if(count == 0) // 如果是第一条信息 + { + // 输出列标题 + printf("%-20s %-20s %-8s %-8s %-10s %-6s %-10s %-8s %s\n", + "商品编号", "商品名", "商品进价", "商品售价", "生产日期", "保质期", "进货日期", "剩余数量", "库存位置"); + } + repo_printGoodsInfo(stdout, p); // 输出商品信息 + count++; + p = p->next; + } + if(count != 0) + { + printf("\n库存信息共 %d 条。\n", count); // 输出条数 + printf("是否将库存信息输出到文件?如果需要输出,请键入yes,键入其它字符返回主菜单:"); + char choice[5]; + scanf("%s", choice); + fflush(stdin); + if(strcmp(choice, "yes") == 0) + { + // 输出到文件 + int fcount = 0; + FILE *fp = fopen("Repo Info.txt", "w"); + p = listHead->next; + while(p != NULL) + { + if(fcount == 0) // 如果是第一条预警信息 + { + // 输出列标题 + fprintf(fp, "%-20s %-20s %-8s %-8s %-10s %-6s %-10s %-8s %s\n", + "商品编号", "商品名", "商品进价", "商品售价", "生产日期", "保质期", "进货日期", "剩余数量", "库存位置"); + } + repo_printGoodsInfo(fp, p); // 输出商品信息 + fcount++; + p = p->next; + } + fclose(fp); + printf("库存信息已写入 Repo Info.txt\n"); + } + } + system("pause"); + return true; +} + +/**************************************************** + * repo_goodsTooMuchWarning -- 查询库存积压预警 + * 参数:listHead:库存商品链表的头指针 + * 返回值:查询成功,返回true + * 查询失败,返回false + ****************************************************/ +bool repo_goodsTooMuchWarning(goods *listHead) +{ + system("title 库存管理 - 库存积压预警"); + if(listHead->next == NULL) // 库存为空 + { + printf("库存为空!\n"); // 输出提示信息 + system("pause"); + return false; + } + printf("请输入积压时长预警值(库存积压时长大于此天数时将会发出预警):\n\n"); + printf(">>> "); + int warningValue = 0; // 积压时长预警值 + int count = 0; // 预警的条数 + while(scanf("%d", &warningValue) != 1 || warningValue <= 0) + { + // 输入不是数字或小于等于0,视为输入非法 + printf("输入错误,请重新输入:"); + } + fflush(stdin); + goods *p = listHead->next; + 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); + // 创建变量current_date,记录今天的日期 + + while(p != NULL) + { + // 库存积压时长大于预警值,即当前日期 > 进货日期 + 积压时长预警天数 + if(current_date > addDay(p->purchase_Date, warningValue)) + { + if(count == 0) // 如果是第一条预警信息 + { + // 输出列标题 + printf("%-20s %-20s %-8s %-8s %-10s %-6s %-10s %-8s %s\n", + "商品编号", "商品名", "商品进价", "商品售价", "生产日期", "保质期", "进货日期", "剩余数量", "库存位置"); + } + repo_printGoodsInfo(stdout, p); // 输出商品信息 + count++; + } + p = p->next; + } + if(count != 0) + { + printf("\n共 %d 条预警。\n", count); // 输出预警的条数 + printf("是否将预警信息输出到文件?如果需要输出,请键入yes,键入其它字符返回主菜单:"); + char choice[5]; + scanf("%s", choice); + fflush(stdin); + if(strcmp(choice, "yes") == 0) + { + // 输出到文件 + int fcount = 0; + FILE *fp = fopen("Goods Too Much - Warning.txt", "w"); + p = listHead->next; + while(p != NULL) + { + // 库存积压时长大于预警值,即当前日期 > 进货日期 + 积压时长预警天数 + if(current_date > addDay(p->purchase_Date, warningValue)) + { + if(fcount == 0) // 如果是第一条预警信息 + { + // 输出列标题 + fprintf(fp, "%-20s %-20s %-8s %-8s %-10s %-6s %-10s %-8s %s\n", + "商品编号", "商品名", "商品进价", "商品售价", "生产日期", "保质期", "进货日期", "剩余数量", "库存位置"); + } + repo_printGoodsInfo(fp, p); // 输出商品信息 + fcount++; + } + p = p->next; + } + fclose(fp); + printf("库存积压预警信息已写入 Goods Too Much - Warning.txt\n"); + } + } + else + { + printf("没有积压超过 %d 天的货物。\n", warningValue); // 输出提示信息 + } + system("pause"); + return true; +} + +/**************************************************** + * repo_goodsTooLittleWarning -- 查询缺货断货预警 + * 参数:listHead:库存商品链表的头指针 + * 返回值:查询成功,返回true + * 查询失败,返回false + ****************************************************/ +bool repo_goodsTooLittleWarning(goods *listHead) +{ + system("title 库存管理 - 缺货断货预警"); + if(listHead->next == NULL) // 库存为空 + { + printf("库存为空!\n"); // 输出提示信息 + system("pause"); + return false; + } + printf("请输入库存量预警值(剩余库存小于此数量时将会发出预警):\n\n"); + printf(">>> "); + int warningValue = 0; // 库存量预警值 + int count = 0; // 预警的条数 + while(scanf("%d", &warningValue) != 1 || warningValue <= 0) + { + // 输入不是数字或小于等于0,视为输入非法 + printf("输入错误,请重新输入:"); + } + fflush(stdin); + goods *p = listHead->next; + while(p != NULL) + { + if(p->remain_Number < warningValue) // 剩余库存小于预警值 + { + if(count == 0) // 如果是第一条预警信息 + { + // 输出列标题 + printf("%-20s %-20s %-8s %-8s %-10s %-6s %-10s %-8s %s\n", + "商品编号", "商品名", "商品进价", "商品售价", "生产日期", "保质期", "进货日期", "剩余数量", "库存位置"); + } + repo_printGoodsInfo(stdout, p); // 输出商品信息 + count++; + } + p = p->next; + } + if(count != 0) + { + printf("\n共 %d 条预警。\n", count); // 输出预警的条数 + printf("是否将预警信息输出到文件?如果需要输出,请键入yes,键入其它字符返回主菜单:"); + char choice[5]; + scanf("%s", choice); + fflush(stdin); + if(strcmp(choice, "yes") == 0) + { + // 输出到文件 + int fcount = 0; + FILE *fp = fopen("Goods Too Little - Warning.txt", "w"); + p = listHead->next; + while(p != NULL) + { + if(p->remain_Number < warningValue) // 剩余库存小于预警值 + { + if(fcount == 0) // 如果是第一条预警信息 + { + // 输出列标题 + fprintf(fp, "%-20s %-20s %-8s %-8s %-10s %-6s %-10s %-8s %s\n", + "商品编号", "商品名", "商品进价", "商品售价", "生产日期", "保质期", "进货日期", "剩余数量", "库存位置"); + } + repo_printGoodsInfo(fp, p); // 输出商品信息 + fcount++; + } + p = p->next; + } + fclose(fp); + printf("缺货断货预警信息已写入 Goods Too Little - Warning.txt\n"); + } + } + else + { + printf("没有剩余库存小于 %d 的货物。\n", warningValue); // 输出提示信息 + } + system("pause"); + return true; +} + +/**************************************************** + * repo_goodsOverdueWarning -- 查询货物过期预警 + * 参数:listHead:库存商品链表的头指针 + * 返回值:查询成功,返回true + * 查询失败,返回false + ****************************************************/ +bool repo_goodsOverdueWarning(goods *listHead) +{ + system("title 库存管理 - 货物过期预警"); + if(listHead->next == NULL) // 库存为空 + { + printf("库存为空!\n"); // 输出提示信息 + system("pause"); + return false; + } + int count = 0; // 预警的条数 + goods *p = listHead->next; + 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); + // 创建变量current_date,记录今天的日期 + + while(p != NULL) + { + // 库存商品已经过期,即当前日期 > 生产日期 + 保质期 + if(current_date > addDay(p->produce_Date, p->quality_Date)) + { + if(count == 0) // 如果是第一条预警信息 + { + // 输出列标题 + printf("%-20s %-20s %-8s %-8s %-10s %-6s %-10s %-8s %s\n", + "商品编号", "商品名", "商品进价", "商品售价", "生产日期", "保质期", "进货日期", "剩余数量", "库存位置"); + } + repo_printGoodsInfo(stdout, p); // 输出商品信息 + count++; + } + p = p->next; + } + if(count != 0) + { + printf("\n共 %d 条预警。\n", count); // 输出预警的条数 + printf("是否将预警信息输出到文件?如果需要输出,请键入yes,键入其它字符返回主菜单:"); + char choice[5]; + scanf("%s", choice); + fflush(stdin); + if(strcmp(choice, "yes") == 0) + { + // 输出到文件 + int fcount = 0; + FILE *fp = fopen("Goods Overdue - Warning.txt", "w"); + p = listHead->next; + while(p != NULL) + { + // 库存商品已经过期,即当前日期 > 生产日期 + 保质期 + if(current_date > addDay(p->produce_Date, p->quality_Date)) + { + if(fcount == 0) // 如果是第一条预警信息 + { + // 输出列标题 + fprintf(fp, "%-20s %-20s %-8s %-8s %-10s %-6s %-10s %-8s %s\n", + "商品编号", "商品名", "商品进价", "商品售价", "生产日期", "保质期", "进货日期", "剩余数量", "库存位置"); + } + repo_printGoodsInfo(fp, p); // 输出商品信息 + fcount++; + } + p = p->next; + } + fclose(fp); + printf("货物过期预警信息已写入 Goods Overdue - Warning.txt\n"); + } + } + else + { + printf("没有已经过期的货物。\n"); // 输出提示信息 + } + system("pause"); + return true; +} + +/**************************************************** + * repo_main -- 库存管理主函数 + * 参数:无 + * 返回值:无 + ****************************************************/ +void repo_main() +{ + puts(" 1 - 库存查询"); + puts(" 2 - 库存积压预警"); + puts(" 3 - 缺货断货预警"); + puts(" 4 - 货物过期预警"); + puts(" 0 - 返回主菜单"); + printf("请选择:"); + int choice; + scanf("%d", &choice); + fflush(stdin); + switch(choice) + { + case 1:system("cls"); repo_showRepoInfo(commodity_head); break; // 库存查询 + case 2:system("cls"); repo_goodsTooMuchWarning(commodity_head); break; // 库存积压预警 + case 3:system("cls"); repo_goodsTooLittleWarning(commodity_head); break; // 缺货断货预警 + case 4:system("cls"); repo_goodsOverdueWarning(commodity_head); break; // 货物过期预警 + case 0:return; // 返回主菜单 + + default:puts("输入错误!"); system("pause"); break; + } +} \ No newline at end of file diff --git a/code/repo.h b/code/repo.h new file mode 100644 index 0000000..6102c26 --- /dev/null +++ b/code/repo.h @@ -0,0 +1,34 @@ +#ifndef __REPO_H__ +#define __REPO_H__ + +// 标准头文件结构 + +#include +#include +#include +#include +#include "date.h" +#include "sell.h" + +// 商品(库存)头指针 +extern commodity commodity_head; + +// 输出p所指向的商品信息 +void repo_printGoodsInfo(FILE *fp, goods *p); + +// 库存查询 +bool repo_showRepoInfo(goods *listHead); + +// 查询库存积压预警 +bool repo_goodsTooMuchWarning(goods *listHead); + +// 查询缺货断货预警 +bool repo_goodsTooLittleWarning(goods *listHead); + +// 查询货物过期预警 +bool repo_goodsOverdueWarning(goods *listHead); + +// 库存管理主函数 +void repo_main(); + +#endif -- Gitee