目录
1.功能介绍(主菜单-有什么功能)
2.结构体的定义(定义一个结构体类型)
3.主函数(如何调用分函数)
4.初始化顺序表(数组加上数组的附加信息)
5.退出程序同时保存数据到文档
6.增加员工信息
7.删除员工信息
8.按照名字查找(查询工资信息)
9. 修改员工信息
10. 按照工资排序
11.按照工号排序
12. 计算工资信息
13.打印工资信息
14. 统计员工总数
15.default语句
16.源代码
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("当前系统人数:%dn", ST.size);
default:
printf("********输入错误,请重新输入********n");
break;
}
} while (input);
}
以下是功能的具体实现
4.初始化顺序表(数组加上数组的附加信息)
1.size和capacity的关系-->扩容(检查是否满了)
2.初始化
3.把上一次的数据加载到文件中-->持久化
讲一下:这个0123的标号的伏笔
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("当前系统人数:%dn", ST.size);
default:
printf("********输入错误,请重新输入********n");
break;
}
} while (input);
}
以下是功能的具体实现
4.初始化顺序表(数组加上数组的附加信息)
1.size和capacity的关系-->扩容(检查是否满了)
2.初始化
3.把上一次的数据加载到文件中-->持久化
1.do while语句(前后呼应)
2.switch case break;语句和case内部的每一步在干干嘛
3.传值调用和传址调用
以下是功能的具体实现
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);
}
5.退出程序同时保存数据到文档
1.文件的分类,为什么要有文件操作
2.关于fopen函数,fread函数,fwrite函数
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;
}
6.增加员工信息
1.打包操作
2.顺序表的插入
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.存在则执行顺序表的删除操作,覆盖问题
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的员工信息
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 %-10sn", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资", "税款", "实发工资");
printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lfn",
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);
}
}
9. 修改员工信息
1.同上
2.修改if else if和go to 语句
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");
}
10. 按照工资排序
1.快速排序的原理
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);
}
11.按照工号排序
1.直接插入排序
2.希尔排序的原理
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;
}
}
}
12. 计算工资信息
数学计算
数学计算
主:
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;
}
}
13.打印工资信息
格式控制
格式控制
主:
case 8:
printf("********打印工资信息********n");
PrintSeqList(&ST);
break;
分:
void PrintSeqList(SeqList* ps)
{
printf("%-20s %-20s %-10s %-10s %-10s %-10s %-10s %-10sn", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资","税款","实发工资");
for (int i = 0; i < ps->size; i++)
{
printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lfn",
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);
}
}
14. 统计员工总数
case 9:
printf("********统计员工人数********n");
printf("当前系统人数:%dn", ST.size);
15.default语句
default:
printf("********输入错误,请重新输入********n");
break;
16.源代码
//Employee.c
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
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 %-10sn", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资", "税款", "实发工资");
printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lfn",
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 %-10sn", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资","税款","实发工资");
for (int i = 0; i < ps->size; i++)
{
printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lfn",
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("当前系统人数:%dn", ST.size);
default:
printf("********输入错误,请重新输入********n");
break;
}
} while (input);
}
17.效果预览图
//Employee.c #define _CRT_SECURE_NO_WARNINGS 1 #define _CRT_SECURE_NO_WARNINGS 1 #include17.效果预览图#include #include #include 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 %-10sn", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资", "税款", "实发工资"); printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lfn", 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 %-10sn", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资","税款","实发工资"); for (int i = 0; i < ps->size; i++) { printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lfn", 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("当前系统人数:%dn", ST.size); default: printf("********输入错误,请重新输入********n"); break; } } while (input); }
类似的,下面为学生信息管理系统
#define _CRT_SECURE_NO_WARNINGS 1 #include#include #include 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 %-20sn", "姓名", "学号", "语文成绩", "语文成绩排名"); for (int i = 0; i < ps->size; i++) { printf("%-20s %-20s %-20.2f %-20dn", ps->stu[i].name, ps->stu[i].id, ps->stu[i].ChiScore, i + 1); } } void DisPlayByMatScore(SeqList* ps) { printf("%-20s %-20s %-20s %-20sn", "姓名", "学号", "数学成绩", "数学成绩排名"); for (int i = 0; i < ps->size; i++) { printf("%-20s %-20s %-20.2f %-20dn", ps->stu[i].name, ps->stu[i].id, ps->stu[i].MatScore, i + 1); } } void DisPlayByEngScore(SeqList* ps) { printf("%-20s %-20s %-20s %-20sn", "姓名", "学号", "英语成绩", "英语成绩排名"); for (int i = 0; i < ps->size; i++) { printf("%-20s %-20s %-20.2f %-20dn", 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("tt***********查询课程结果***********nn"); 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("nn% -20s % -20s % -20s % -20s % -20sn", "不及格人数(0-60)", "及格人数(60-100)", "良好人数(60-90)", "优秀人数(90-100)","平均分"); printf("%-20d %-20d %-20d %-20d %-20.2fn", 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("tt***********查询学生结果***********n"); printf("%-20s %-20s %-20s %-20s %-20s %-20s %-20sn","姓名","学号", "语文成绩", "数学成绩", "英语成绩", "总成绩", "总成绩排名"); printf("%-20s %-20s %-20.2f %-20.2f %-20.2f %-20.2f %-20dn", 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 %-20sn", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩", "排名"); for (int i = 0; i < ps->size; i++) { printf("%-20s %-20s %-20.2f %-20.2f %-20.2f %-20.2f %-20dn", 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("当前学生总数:%dn", ST.size); break; case 9: printf("t******打印学生信息******n"); PrintSeqList(&ST); break; default: printf("选择错误,请重新选择(提示:请在0-9中选择):>"); break; } } while (input); }



