diff --git a/code/date.cpp b/code/date.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0ebd7f3d526834f21cc3ad65bff6b125c78bfb04 --- /dev/null +++ b/code/date.cpp @@ -0,0 +1,85 @@ +#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; +} diff --git a/code/date.h b/code/date.h new file mode 100644 index 0000000000000000000000000000000000000000..afc0acd702db3ea7a3e3550255f1326ceecdc9b8 --- /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 0000000000000000000000000000000000000000..0fc8626cada063836c546048591db71029d5ca14 --- /dev/null +++ b/code/employee.cpp @@ -0,0 +1,149 @@ +#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 diff --git a/code/employee.h b/code/employee.h new file mode 100644 index 0000000000000000000000000000000000000000..4cab13f33cdfdaf2c29c9d75368d600266086195 --- /dev/null +++ b/code/employee.h @@ -0,0 +1,48 @@ +#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 diff --git a/code/repo.cpp b/code/repo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9cf68bd81ec5a7146308c1af1bc3739ee9e54c69 --- /dev/null +++ b/code/repo.cpp @@ -0,0 +1,7 @@ +#include +#include "repo.h" + +// 查询商品信息结构体中是否有剩余货 + +// 卖出货后减去相应数量 + diff --git a/code/repo.h b/code/repo.h new file mode 100644 index 0000000000000000000000000000000000000000..a507af6e2c499a82641029fe9e2b173ccad4d6a2 --- /dev/null +++ b/code/repo.h @@ -0,0 +1,8 @@ +#ifndef __REPO_H__ +#define __REPO_H__ + +// 标准头文件结构。 + + + +#endif