1.功能介绍(主菜单-有什么功能)
讲一下:这个0123的标号的伏笔
//菜单函数 void Meau(void) { printf("--------------------------------\n"); printf("--- 欢迎来到员工工资管理系统 ---\n"); printf("--------------------------------\n"); printf("---- 0.退出程序 ----\n"); printf("---- 1.增加工资信息 ----\n"); printf("---- 2.删除工资信息 ----\n"); printf("---- 3.按名字查工资 ----\n"); printf("---- 4.修改工资信息 ----\n"); printf("---- 5.按照工资排序 ----\n"); printf("---- 6.按照工号排序 ----\n"); printf("---- 7.计算员工工资 ----\n"); printf("---- 8.打印工资信息 ----\n"); printf("---- 9.统计员工人数 ----\n"); printf("-------------------------------\n"); }
2.结构体的定义(定义一个结构体类型)
1.画一个盒子的嵌套图
2.各种结构体类型成员的命名和函数命名规范
3.typedef类型重命名
4.size和capacity 的引入
5.计算员工工资放的位置
typedef struct Employee { char name[20]; char id[20]; double InitWages; double bonus; double deduct; double NextWages; double taxes; double FinaWages; }Employee; typedef struct SeqList { Employee* emp; int size; int capacity; }SeqList;
3.主函数(如何调用分函数)
1.do while语句(前后呼应)
2.switch case break;语句和case内部的每一步在干干嘛
3.传值调用和传址调用
int main() { int input = 0; SeqList ST; InitSeqList(&ST); do//先执行一次 { Meau(); printf("请输入您的选择(提示:请在0-9之间选择):>"); scanf("%d", &input); switch (input) { case 0: printf("欢迎您的使用,即将退出程序.\n"); SaveSeqList(&ST); break; case 1: printf("********增加工资信息.********\n"); int nums = 0; printf("请输入您要增加的员工信息的员工数量:>"); scanf("%d", &nums); Employee temp = { 0 }; for (int i = 1; i <= nums; i++) { InitEmployee(&temp,i); AddSeqList(&ST,temp); } CountSeqList(&ST); break; case 2: printf("********删除工资信息.********\n"); DelSeqList(&ST); break; case 3: printf("********查询工资信息.********\n"); SearByName(&ST); break; case 4: printf("********修改工资信息.********\n"); ModifySeqList(&ST); CountSeqList(&ST); break; case 5: printf("********按照工资排序.(从高到低)********\n"); QsortByFinaWages(&ST,0,ST.size); PrintSeqList(&ST); break; case 6: printf("********按照工号排序.(从小到大)********\n"); ShellSortById(&ST); PrintSeqList(&ST); break; case 7: printf("********计算员工工资********\n"); CountSeqList(&ST); printf("计算成功.\n"); break; case 8: printf("********打印工资信息********\n"); PrintSeqList(&ST); break; case 9: printf("********统计员工人数********\n"); printf("当前系统人数:%d\n", ST.size); default: printf("********输入错误,请重新输入********\n"); break; } } while (input); }
以下是功能的具体实现
4.初始化顺序表(数组加上数组的附加信息)
1.size和capacity的关系-->扩容(检查是否满了)
2.初始化
3.把上一次的数据加载到文件中-->持久化
主:
1. SeqList ST; 2. InitSeqList(&ST);
分:
void CheckCapacity(SeqList* ps) { if (ps->size == ps->capacity) { int newcapacity = 2 * ps->capacity; Employee* temp = (Employee*)realloc(ps->emp,sizeof(Employee) * newcapacity); if (temp==NULL) { perror("CheckCapacity::realloc"); return; } ps->emp = temp; ps->capacity = newcapacity; printf("扩容成功\n"); } } void LoadSeqList(SeqList* ps) { FILE* pf = fopen("D:\\桌面\\test.txt", "rb"); if (pf == NULL) { perror("LoadSeqList::fopen"); return; } Employee temp = { 0 }; while (fread(&temp, sizeof(Employee), 1, pf)) { CheckCapacity(ps); ps->emp[ps->size] = temp; ps->size++; } fclose(pf); pf = NULL; } void InitSeqList(SeqList* ps) { ps->emp = (Employee*)malloc(sizeof(Employee) * 4); if (ps->emp == NULL) { perror("InitSeqList::malloc"); return; } ps->size = 0; ps->capacity = 4; LoadSeqList(ps); }
5.退出程序同时保存数据到文档
1.文件的分类,为什么要有文件操作
2.关于fopen函数,fread函数,fwrite函数
主函数调用
1. case 0: 2. printf("欢迎您的使用,即将退出程序.\n"); 3. SaveSeqList(&ST); 4. break;
分函数实现
void SaveSeqList(SeqList* ps) { FILE* pf = fopen("D:\\桌面\\test.txt", "wb"); if (pf == NULL) { perror("LoadSeqList::fopen"); return; } for (int i = 0; i < ps->size; i++) { fwrite(ps->emp + i, sizeof(Employee), 1, pf); } fclose(pf); pf = NULL; }
6.增加员工信息
1.打包操作
2.顺序表的插入
主:
case 1: printf("********增加工资信息.********\n"); int nums = 0; printf("请输入您要增加的员工信息的员工数量:>"); scanf("%d", &nums); Employee temp = { 0 }; for (int i = 1; i <= nums; i++) { InitEmployee(&temp,i); AddSeqList(&ST,temp); } CountSeqList(&ST); break;
分:
void InitEmployee(Employee* ps, int i) { printf("请输入第%d位待插入的员工工资信息:\n",i); printf("请输入员工姓名:>"); scanf("%s", ps->name); printf("请输入员工工号:>"); scanf("%s", ps->id); printf("请输入员工的基本工资:>"); scanf("%lf", &(ps->InitWages)); printf("请输入员工的奖金:>"); scanf("%lf", &(ps->bonus)); printf("请输入员工的扣款:>"); scanf("%lf", &(ps->deduct)); printf("请输入员工的税款:>"); scanf("%lf", &(ps->taxes)); } void AddSeqList(SeqList* ps, Employee temp) { CheckCapacity(ps); ps->emp[ps->size] = temp; ps->size++; printf("增加成功.\n"); }
7.删除员工信息
0.局部变量和全局变量
1.输入姓名,定位下标(封装成函数),strcmp函数,不存在返回-1 的原因
2.存在则执行顺序表的删除操作,覆盖问题
主:
case 2: printf("********删除工资信息.********\n"); DelSeqList(&ST); break;
分:
int FindByName(SeqList* ps,char* name) { for (int i = 0; i < ps->size; i++) { if (strcmp(name, ps->emp[i].name) == 0) { return i; } } return -1; } void DelSeqList(SeqList* ps) { if (ps->size == 0) { printf("当前员工总数为0,无法删除.\n"); } char name[20] = { 0 }; printf("请输入您要删除的员工信息的员工姓名:>"); scanf("%s", name); int pos = FindByName(ps,name); if (pos == -1) { printf("当前系统中不存在名字为%s的员工.\n", name); return; } else { int begin = pos + 1; while (begin < ps->size) { ps->emp[begin -1] = ps->emp[begin]; begin++; } ps->size--; } printf("删除成功.\n"); }
8.按照名字查找(查询工资信息)
1.同上的定位函数
2.打印下标为i的员工信息
主:
case 3: printf("********查询工资信息.********\n"); SearByName(&ST); break;
分:
void SearByName(SeqList* ps) { char name[20] = { 0 }; printf("请输入您要查询的员工信息的员工姓名:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("当前系统中不存在名字为%s的员工.\n", name); return; } else { printf("%-20s %-20s %-10s %-10s %-10s %-10s %-10s %-10s\n", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资", "税款", "实发工资"); printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf\n", \ ps->emp[pos].name, ps->emp[pos].id, ps->emp[pos].InitWages, ps->emp[pos].bonus, ps->emp[pos].deduct, ps->emp[pos].NextWages, ps->emp[pos].taxes, ps->emp[pos].FinaWages); } }