目录
讲一下:这个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");
- }
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;
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);
- }
以下是功能的具体实现
1.size和capacity的关系-->扩容(检查是否满了)
2.初始化
3.把上一次的数据加载到文件中-->持久化
主:
- SeqList ST;
- 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);
- }
1.文件的分类,为什么要有文件操作
2.关于fopen函数,fread函数,fwrite函数
主函数调用
- case 0:
- printf("欢迎您的使用,即将退出程序.\n");
- SaveSeqList(&ST);
- 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;
- }
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");
- }
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");
- }
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);
- }
- }
1.同上
2.修改if else if和go to 语句
主:
- case 4:
- printf("********修改工资信息.********\n");
- ModifySeqList(&ST);
- CountSeqList(&ST);
- break;
分:
- void ModifySeqList(SeqList* ps)
- {
-
- char name[20] = { 0 };
- printf("请输入您要修改的员工信息的员工姓名:>");
- scanf("%s", name);
- int pos = FindByName(ps, name);
- if (pos == -1)
- {
- printf("当前系统中不存在名字为%s的员工.\n", name);
- return;
- }
- char choice[20] = { 0 };
- rechoice:
- printf("请输入你要修改的信息项目名称");
- printf("(提示:您可选择输入员工工号,基本工资,奖金,扣款,税款):>");
- scanf("%s", choice);
- printf("请输入修改后的该信息项目值:>");
- if (strcmp(choice, "员工工号") == 0)
- {
- scanf("%s", ps->emp[pos].id);
- }
- else if (strcmp(choice, "基本工资") == 0)
- {
- scanf("%lf", &(ps->emp[pos].InitWages));
- }
- else if (strcmp(choice, "奖金") == 0)
- {
- scanf("%lf", &(ps->emp[pos].bonus));
- }
- else if (strcmp(choice, "扣款") == 0)
- {
- scanf("%lf", &(ps->emp[pos].deduct));
- }
- else if (strcmp(choice, "税款") == 0)
- {
- scanf("%lf", &(ps->emp[pos].taxes));
- }
- else
- {
- printf("请在提示中给出的选项中做出选择!\n");
- goto rechoice;
- }
- printf("修改成功.\n");
- }
1.快速排序的原理
主:
- case 5:
- printf("********按照工资排序.(从高到低)********\n");
- QsortByFinaWages(&ST,0,ST.size);
- PrintSeqList(&ST);
- break;
分:
- void QsortByFinaWages(SeqList* ps, int begin, int end)
- {
- if (begin >= end)
- {
- return;
- }
- int keyi = begin;
- int left = begin, right = end;
- while (left < right)
- {
- while (left < right && ps->emp[right].FinaWages <= ps->emp[keyi].FinaWages)
- {
- right--;
- }
- while (left < right && ps->emp[left].FinaWages >= ps->emp[keyi].FinaWages)
- {
- left++;
- }
- Swap(&(ps->emp[left]), &(ps->emp[right]));
- }
- int meeti = left;
- Swap(&(ps->emp[keyi]), &(ps->emp[meeti]));
-
- QsortByFinaWages(ps, begin, meeti - 1);
- QsortByFinaWages(ps, meeti+1, end);
- }
1.直接插入排序
2.希尔排序的原理
主:
- case 6:
- printf("********按照工号排序.(从小到大)********\n");
- ShellSortById(&ST);
- PrintSeqList(&ST);
- break;
分:
- void ShellSortById(SeqList* ps)
- {
- int gap = ps->size;
- while (gap > 1)
- {
- gap = (gap / 3 + 1);
- for (int i = 0; i < ps->size - gap; i++)
- {
- int end = i;
- Employee temp = ps->emp[i + gap];
- while (end >= 0)
- {
- if (strcmp(ps->emp[end].id , temp.id)>0)
- {
- ps->emp[end + gap] = ps->emp[end];
- end -= gap;
- }
- else
- {
- break;
- }
- }
- ps->emp[end + gap] = temp;
-
- }
- }
- }
数学计算
主:
- case 7:
- printf("********计算员工工资********\n");
- CountSeqList(&ST);
- printf("计算成功.\n");
分:
- void CountSeqList(SeqList* ps)
- {
- for (int i = 0; i < ps->size; i++)
- {
- ps->emp[i].NextWages = ps->emp[i].InitWages + ps->emp[i].bonus - ps->emp[i].deduct;
- ps->emp[i].FinaWages = ps->emp[i].NextWages - ps->emp[i].taxes;
- }
-
- }
格式控制
主:
- case 8:
- printf("********打印工资信息********\n");
- PrintSeqList(&ST);
- break;
分:
- void PrintSeqList(SeqList* ps)
- {
- printf("%-20s %-20s %-10s %-10s %-10s %-10s %-10s %-10s\n", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资","税款","实发工资");
- for (int i = 0; i < ps->size; i++)
- {
- printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf\n",\
- ps->emp[i].name,ps->emp[i].id, ps->emp[i].InitWages, ps->emp[i].bonus, ps->emp[i].deduct,ps->emp[i].NextWages,ps->emp[i].taxes,ps->emp[i].FinaWages);
- }
- }
- case 9:
- printf("********统计员工人数********\n");
- printf("当前系统人数:%d\n", ST.size);
- default:
- printf("********输入错误,请重新输入********\n");
- break;
- //Employee.c
-
-
- #define _CRT_SECURE_NO_WARNINGS 1
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<windows.h>
-
- 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;
-
- 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);
- }
-
- //菜单函数
- 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");
- }
-
- 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;
- }
-
-
-
- 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");
- }
-
-
- 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");
- }
-
- 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);
- }
- }
-
-
-
- void ModifySeqList(SeqList* ps)
- {
-
- char name[20] = { 0 };
- printf("请输入您要修改的员工信息的员工姓名:>");
- scanf("%s", name);
- int pos = FindByName(ps, name);
- if (pos == -1)
- {
- printf("当前系统中不存在名字为%s的员工.\n", name);
- return;
- }
- char choice[20] = { 0 };
- rechoice:
- printf("请输入你要修改的信息项目名称");
- printf("(提示:您可选择输入员工工号,基本工资,奖金,扣款,税款):>");
- scanf("%s", choice);
- printf("请输入修改后的该信息项目值:>");
- if (strcmp(choice, "员工工号") == 0)
- {
- scanf("%s", ps->emp[pos].id);
- }
- else if (strcmp(choice, "基本工资") == 0)
- {
- scanf("%lf", &(ps->emp[pos].InitWages));
- }
- else if (strcmp(choice, "奖金") == 0)
- {
- scanf("%lf", &(ps->emp[pos].bonus));
- }
- else if (strcmp(choice, "扣款") == 0)
- {
- scanf("%lf", &(ps->emp[pos].deduct));
- }
- else if (strcmp(choice, "税款") == 0)
- {
- scanf("%lf", &(ps->emp[pos].taxes));
- }
- else
- {
- printf("请在提示中给出的选项中做出选择!\n");
- goto rechoice;
- }
- printf("修改成功.\n");
- }
-
- void Swap(Employee* a, Employee* b)
- {
- Employee temp = *a;
- *a = *b;
- *b = temp;
- }
-
-
- void QsortByFinaWages(SeqList* ps, int begin, int end)
- {
- if (begin >= end)
- {
- return;
- }
- int keyi = begin;
- int left = begin, right = end;
- while (left < right)
- {
- while (left < right && ps->emp[right].FinaWages <= ps->emp[keyi].FinaWages)
- {
- right--;
- }
- while (left < right && ps->emp[left].FinaWages >= ps->emp[keyi].FinaWages)
- {
- left++;
- }
- Swap(&(ps->emp[left]), &(ps->emp[right]));
- }
- int meeti = left;
- Swap(&(ps->emp[keyi]), &(ps->emp[meeti]));
-
- QsortByFinaWages(ps, begin, meeti - 1);
- QsortByFinaWages(ps, meeti+1, end);
- }
-
- void ShellSortById(SeqList* ps)
- {
- int gap = ps->size;
- while (gap > 1)
- {
- gap = (gap / 3 + 1);
- for (int i = 0; i < ps->size - gap; i++)
- {
- int end = i;
- Employee temp = ps->emp[i + gap];
- while (end >= 0)
- {
- if (strcmp(ps->emp[end].id , temp.id)>0)
- {
- ps->emp[end + gap] = ps->emp[end];
- end -= gap;
- }
- else
- {
- break;
- }
- }
- ps->emp[end + gap] = temp;
-
- }
- }
- }
-
-
-
- void CountSeqList(SeqList* ps)
- {
- for (int i = 0; i < ps->size; i++)
- {
- ps->emp[i].NextWages = ps->emp[i].InitWages + ps->emp[i].bonus - ps->emp[i].deduct;
- ps->emp[i].FinaWages = ps->emp[i].NextWages - ps->emp[i].taxes;
- }
-
- }
-
- void PrintSeqList(SeqList* ps)
- {
- printf("%-20s %-20s %-10s %-10s %-10s %-10s %-10s %-10s\n", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资","税款","实发工资");
- for (int i = 0; i < ps->size; i++)
- {
- printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf\n",\
- ps->emp[i].name,ps->emp[i].id, ps->emp[i].InitWages, ps->emp[i].bonus, ps->emp[i].deduct,ps->emp[i].NextWages,ps->emp[i].taxes,ps->emp[i].FinaWages);
- }
- }
-
- 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);
- }

类似的,下面为学生信息管理系统
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
-
- typedef struct Student
- {
- char name[20];
- char id[20];
- float ChiScore;
- float MatScore;
- float EngScore;
- float SumScore;
- }Student;
-
- typedef struct SeqList
- {
- Student* stu;
- int size;
- int capacity;
- }SeqList;
-
-
- void meau1(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");
- }
-
- //case -1 初始化: 初始化函数(3)
-
- void CheckCapacity(SeqList* ps)
- {
- if (ps->size == ps->capacity)
- {
- int newcapacity = 2 * ps->capacity;
- Student* temp = (Student*)realloc(ps->stu, sizeof(Student) * newcapacity);
- if (temp == NULL)
- {
- perror("CheckCapacity::realloc:>");
- return;
- }
- ps->capacity = newcapacity;
- ps->stu = temp;
- printf("扩容成功.\n");
- }
- }
-
- void LoadSeqList(SeqList* ps)
- {
- FILE* pf = fopen("D:\\桌面\\test.txt", "rb");
- if (pf == NULL)
- {
- perror("LoadSeqList::fopen:>");
- return;
- }
-
- Student temp = { 0 };
- while (fread(&temp, sizeof(Student), 1, pf))
- {
- CheckCapacity(ps);
- ps->stu[ps->size] = temp;
- ps->size++;
- }
-
- fclose(pf);
- pf = NULL;
- }
-
- void InitSeqList(SeqList* ps)
- {
- ps->stu = (Student*)malloc(sizeof(Student) * 4);
- if (ps->stu == NULL)
- {
- perror("InitSeqList::malloc:>");
- return;
- }
- ps->capacity = 4;
- ps->size = 0;
-
- LoadSeqList(ps);
- }
-
- //case 0 退出程序:保存数据到文件函数(1)
-
- 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->stu + i, sizeof(Student), 1, pf);
- }
-
- fclose(pf);
- pf = NULL;
- }
-
-
-
- //case 1:录入学生信息 装配和插入函数(2)
-
- void InitStudent(Student* ps,int i)
- {
- printf("请输入第%d个待录入的学生信息:\n", i);
-
- printf("请输入学生的名字:>");
- scanf("%s", ps->name);
- printf("请输入学生的学号:>");
- scanf("%s", ps->id);
-
- printf("请输入学生的语文成绩(0-100):>");
- scanf("%f", &(ps->ChiScore));
- printf("请输入学生的数学成绩(0-100):>");
- scanf("%f", &(ps->MatScore));
- printf("请输入学生的英语成绩(0-100):>");
- scanf("%f", &(ps->EngScore));
-
- ps->SumScore = ps->ChiScore + ps->MatScore + ps->EngScore;
- }
-
- void AddSeqList(SeqList* ps,Student temp)
- {
- CheckCapacity(ps);
- ps->stu[ps->size] = temp;
- ps->size++;
- }
-
-
-
- //case 2:删除学生信息 菜单函数,定位和删除函数(4)
-
- void meau2(void)
- {
- printf("-- 1.按照名字查找 --\n");
- printf("-- 2.按照学号查找 --\n");
- }
-
- //找得到返回下标,找不到返回-1
- int FindByName(SeqList* ps, const char* name)
- {
- for (int i = 0; i < ps->size; i++)
- {
- if (strcmp(ps->stu[i].name, name) == 0)
- {
- return i;
- }
- }
- return -1;
- }
-
- int FindById(SeqList* ps, const char* id)
- {
- for (int i = 0; i < ps->size; i++)
- {
- if (strcmp(ps->stu[i].id, id) == 0)
- {
- return i;
- }
- }
- return -1;
- }
-
- void DelSeqList(SeqList* ps)
- {
- if (ps->size == 0)
- {
- printf("当前学生总数为0,无法删除.\n");
- return;
- }
- meau2();
- int choice1 = 0;
- rechoice1:
- printf("请根据您要按何种方式查找到要删除的学生,输入相应的编号:>");
- scanf("%d", &choice1);
- int pos = 0;
- if (choice1 == 1)
- {
- char name[20] = { 0 };
- printf("请输入您要删除学生的学生姓名:>");
- scanf("%s", name);
- pos = FindByName(ps, name);
- }
- else if (choice1 == 2)
- {
- char id[20] = { 0 };
- printf("请输入您要删除学生的学生学号:>");
- scanf("%s", id);
- pos = FindById(ps, id);
- }
- else
- {
- printf("选择错误,请重新选择(提示:请在1-2中选择).\n");
- goto rechoice1;
- }
-
- if (pos == -1)
- {
- printf("您现在要删除的学生不存在当前学生信息管理系统中,请重新选择.\n");
- goto rechoice1;
- }
- else
- {
- int begin = pos + 1;
- while (begin < ps->size)
- {
- ps->stu[begin - 1] = ps->stu[begin];
- begin++;
- }
- ps->size--;
- printf("删除成功.\n");
- }
-
- }
-
-
-
- //case 3: 查询指定课程 菜单函数,定位和杂碎函数(10)
-
- void meau3(void)
- {
- printf("-- 1.语文 --\n");
- printf("-- 2.数学 --\n");
- printf("-- 3.英语 --\n");
- }
-
- void Swap(char* buff1, char* buff2,int width)
- {
- while (width--)
- {
- char temp = *buff1;
- *buff1 = *buff2;
- *buff2 = temp;
- buff1++;
- buff2++;
- }
- }
-
-
- int cmp_struct_by_ChiScore(const void* e1, const void* e2)
- {
- return ((Student*)e2)->ChiScore - ((Student*)e1)->ChiScore;
- }
-
- int cmp_struct_by_MatScore(const void* e1, const void* e2)
- {
- return ((Student*)e2)->MatScore - ((Student*)e1)->MatScore;
- }
-
- int cmp_struct_by_EngScore(const void* e1, const void* e2)
- {
- return ((Student*)e2)->EngScore - ((Student*)e1)->EngScore;
- }
-
- void BubbleSort(void* base, int size, int width, float (*cmp)(const void*, const void*))
- {
- int flag = 0;
- for (int i = 0; i < size - 1; i++)
- {
- for (int j = 0; j < size-1- i; j++)
- {
- if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
- {
- Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
- flag = 1;
- }
- }
- if (flag == 0)
- {
- break;
- }
- }
- }
-
- void DisPlayByChiScore(SeqList* ps)
- {
- printf("%-20s %-20s %-20s %-20s\n", "姓名", "学号", "语文成绩", "语文成绩排名");
- for (int i = 0; i < ps->size; i++)
- {
- printf("%-20s %-20s %-20.2f %-20d\n", ps->stu[i].name, ps->stu[i].id, ps->stu[i].ChiScore, i + 1);
- }
- }
-
- void DisPlayByMatScore(SeqList* ps)
- {
- printf("%-20s %-20s %-20s %-20s\n", "姓名", "学号", "数学成绩", "数学成绩排名");
- for (int i = 0; i < ps->size; i++)
- {
- printf("%-20s %-20s %-20.2f %-20d\n", ps->stu[i].name, ps->stu[i].id, ps->stu[i].MatScore, i + 1);
- }
- }
-
- void DisPlayByEngScore(SeqList* ps)
- {
- printf("%-20s %-20s %-20s %-20s\n", "姓名", "学号", "英语成绩", "英语成绩排名");
- for (int i = 0; i < ps->size; i++)
- {
- printf("%-20s %-20s %-20.2f %-20d\n", ps->stu[i].name, ps->stu[i].id, ps->stu[i].EngScore, i + 1);
- }
- }
-
- void SearByCourse(SeqList* ps)
- {
- if (ps->size == 0)
- {
- printf("当前学生总数为0,无法修改.\n");
- return;
- }
- meau3();
- int choice2 = 0;
- rechoice2:
- printf("请根据您要查询课程的名称,选择相应的编号:>");
- scanf("%d", &choice2);
- float sum = 0.00;
- int count1 = 0, count2 = 0;
- printf("\t\t***********查询课程结果***********\n\n");
- if (choice2 == 1)
- {
- for (int i = 0; i < ps->size; i++)
- {
- sum += ps->stu[i].ChiScore;
-
- if (ps->stu[i].ChiScore < 60)
- {
- count1++;
- }
- else if (ps->stu[i].ChiScore < 90)
- {
- count2++;
- }
- }
- BubbleSort(ps->stu, ps->size, sizeof(Student), cmp_struct_by_ChiScore);
- DisPlayByChiScore(ps);
- }
- else if (choice2 == 2)
- {
- for (int i = 0; i < ps->size; i++)
- {
- sum += ps->stu[i].MatScore;
-
- if (ps->stu[i].MatScore < 60)
- {
- count1++;
- }
- else if (ps->stu[i].MatScore < 90)
- {
- count2++;
- }
- }
- BubbleSort(ps->stu, ps->size, sizeof(Student), cmp_struct_by_MatScore);
- DisPlayByMatScore(ps);
- }
- else if (choice2 == 3)
- {
- for (int i = 0; i < ps->size; i++)
- {
- sum += ps->stu[i].EngScore;
-
- if (ps->stu[i].EngScore < 60)
- {
- count1++;
- }
- else if (ps->stu[i].EngScore < 90)
- {
- count2++;
- }
- }
- BubbleSort(ps->stu, ps->size, sizeof(Student), cmp_struct_by_EngScore);
- DisPlayByEngScore(ps);
- }
- else
- {
- printf("选择错误,请重新选择(提示:请在1-3中选择).\n");
- goto rechoice2;
- }
-
- printf("\n\n% -20s % -20s % -20s % -20s % -20s\n", "不及格人数(0-60)", "及格人数(60-100)", "良好人数(60-90)", "优秀人数(90-100)","平均分");
- printf("%-20d %-20d %-20d %-20d %-20.2f\n", count1, ps->size - count1, count2, ps->size - count1 - count2, sum / ps->size);
-
-
- }
-
-
- //case 4:查询指定学生
-
- void SearByStudent(SeqList* ps)
- {
- if (ps->size == 0)
- {
- printf("当前学生总数为0,无法查询.\n");
- return;
- }
- meau2();
- int choice3 = 0;
- rechoice3:
- printf("请根据您要按何种方式查找学生,输入相应的编号:>");
- scanf("%d", &choice3);
- int pos = 0;
- if (choice3 == 1)
- {
- char name[20] = { 0 };
- printf("请输入您要查询学生的学生姓名:>");
- scanf("%s", name);
- pos = FindByName(ps, name);
- }
- else if (choice3 == 2)
- {
- char id[20] = { 0 };
- printf("请输入您要查询学生的学生学号:>");
- scanf("%s", id);
- pos = FindById(ps, id);
- }
- else
- {
- printf("选择错误,请重新选择(提示:请在1-2中选择).\n");
- goto rechoice3;
- }
-
- if (pos == -1)
- {
- printf("您现在要查询的学生不存在当前学生信息管理系统中,请重新选择.\n");
- goto rechoice3;
- }
- else
- {
- printf("\t\t***********查询学生结果***********\n");
- printf("%-20s %-20s %-20s %-20s %-20s %-20s %-20s\n","姓名","学号", "语文成绩", "数学成绩", "英语成绩", "总成绩", "总成绩排名");
- printf("%-20s %-20s %-20.2f %-20.2f %-20.2f %-20.2f %-20d\n", ps->stu[pos].name, ps->stu[pos].id, \
- ps->stu[pos].ChiScore, ps->stu[pos].MatScore, ps->stu[pos].EngScore, ps->stu[pos].SumScore, pos + 1);
- }
- }
-
- //case 5: 修改学生成绩 -菜单函数和修改函数 -先找到这个学生,再进行修改
-
- void ModSeqList(SeqList* ps)
- {
- if (ps->size == 0)
- {
- printf("当前学生总数为0,无法修改.\n");
- return;
- }
- meau2();
- int choice4 = 0;
- rechoice4:
- printf("请根据您要按何种方式查找到要修改的学生,输入相应的编号:>");
- scanf("%d", &choice4);
- int pos = 0;
- if (choice4 == 1)
- {
- char name[20] = { 0 };
- printf("请输入您要修改的学生信息的学生姓名:>");
- scanf("%s", name);
- pos = FindByName(ps, name);
- }
- else if (choice4 == 2)
- {
- char id[20] = { 0 };
- printf("请输入您要修改的学生信息的学生学号:>");
- scanf("%s", id);
- pos = FindById(ps, id);
- }
- else
- {
- printf("选择错误(提示:请在1-2中选择).\n");
- goto rechoice4;
- }
-
- if (pos == -1)
- {
- printf("您现在要查询的学生不存在当前学生信息管理系统中,请重新选择.\n");
- goto rechoice4;
- }
- else
- {
- meau3();
- int input = 0;
- again:
- printf("请根据您要修改的课程成绩的课程名称,选择相应的编号:>");
- scanf("%d", &input);
- printf("请输入修改后的值:>");
- if (input == 1)
- {
- scanf("%f", &(ps->stu[pos].ChiScore));
- }
- else if (input == 2)
- {
- scanf("%f", &(ps->stu[pos].EngScore));
- }
- else if (input == 3)
- {
- scanf("%f", &(ps->stu[pos].EngScore));
- }
- else
- {
- printf("选择错误,请重新选择 (提示:请在1-3中选择):>");
- goto again;
- }
- printf("修改成功.\n");
- }
- }
-
- //case 6: 按照学号排序 -排升序
-
- void Swap2(Student* s1, Student* s2)
- {
- Student temp = *s1;
- *s1 = *s2;
- *s2 = temp;
- }
-
- void QsortById(SeqList* ps, int begin, int end)
- {
- if (begin >= end)
- {
- return;
- }
- int keyi = begin;
- int left = begin, right = end;
- while (left < right)
- {
- while (left < right && strcmp(ps->stu[right].id, ps->stu[keyi].id)>0)
- {
- right--;
- }
- while (left < right && strcmp(ps->stu[left].id, ps->stu[keyi].id) <= 0)
- {
- left++;
- }
- Swap2(&(ps->stu[left]), &(ps->stu[right]));
- }
- int meeti = left;
- Swap2(&(ps->stu[meeti]), &(ps->stu[keyi]));
- QsortById(ps, begin, meeti - 1);
- QsortById(ps, meeti + 1, end);
- }
-
- //case 7: 按照总成绩排序-排降序
-
- void ShellSortBySumScore(SeqList* ps)
- {
- int gap = ps->size;
- while (gap > 1)
- {
- gap = (gap / 3 + 1);
- for (int i = 0; i < ps->size - gap; i++)
- {
- int end = i;
- Student temp = ps->stu[end + gap];
- while (end >= 0)
- {
- if (temp.SumScore > ps->stu[end].SumScore)
- {
- ps->stu[end + gap] = ps->stu[end];
- end--;
- }
- else
- {
- break;
- }
- }
- ps->stu[end + gap] = temp;
- }
- }
- }
-
- //case 9: 打印学生信息
-
- void PrintSeqList(SeqList* ps)
- {
- if (ps->size == 0)
- {
- printf("当前学生总数为0,无法打印.\n");
- return;
- }
- printf("%-20s %-20s %-20s %-20s %-20s %-20s %-20s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩", "排名");
-
- for (int i = 0; i < ps->size; i++)
- {
- printf("%-20s %-20s %-20.2f %-20.2f %-20.2f %-20.2f %-20d\n", ps->stu[i].name, ps->stu[i].id, \
- ps->stu[i].ChiScore, ps->stu[i].MatScore, ps->stu[i].EngScore, ps->stu[i].SumScore, i+1);
- }
- }
-
- int main()
- {
- SeqList ST;
- InitSeqList(&ST);
-
- int input = 0;
-
- do
- {
- meau1();
- printf("请输入您的选择(提示:只能在0-9之间做选择):>");
- scanf("%d", &input);
-
- switch (input)
- {
- case 0:
- printf("\t******感谢您的使用,即将退出程序******\n");
- SaveSeqList(&ST);
- break;
-
- case 1:
- printf("\t******录入学生信息******\n");
- int nums = 0;
- printf("请输入您要录入的学生个数:>");
- scanf("%d", &nums);
-
- Student temp = { 0 };
- for (int i = 1; i <= nums; i++)
- {
- InitStudent(&temp, i);
- AddSeqList(&ST, temp);
- }
- printf("录入成功.\n");
- break;
-
- case 2:
- printf("\t******删除学生信息******\n");
- DelSeqList(&ST);
- break;
-
- case 3:
- printf("\t******查询指定课程******\n");
- SearByCourse(&ST);
- break;
-
- case 4:
- printf("\t******查询指定学生******\n");
- SearByStudent(&ST);
- break;
-
- case 5:
- printf("\t******修改学生信息******\n");
- ModSeqList(&ST);
- break;
-
- case 6:
- printf("\t******按照学号排序 (由小到大)******\n");
- QsortById(&ST, 0, ST.size);
- PrintSeqList(&ST);
- break;
-
- case 7:
- printf("\t******按照总分排序 (由高到低)******\n");
- ShellSortBySumScore(&ST);
- PrintSeqList(&ST);
- break;
-
- case 8:
- printf("\t******统计学生总数******\n");
- printf("当前学生总数:%d\n", ST.size);
- break;
-
- case 9:
- printf("\t******打印学生信息******\n");
- PrintSeqList(&ST);
- break;
-
- default:
- printf("选择错误,请重新选择(提示:请在0-9中选择):>");
- break;
- }
- } while (input);
- }
-