项目名称:学生成绩管理系统
功能:
- 学生成绩录入
- 学生成绩查询
- 学生成绩排序
- 学生成绩修改
- 学生成绩删除
- 学生成绩打印
文件:
test.c: 测试学生成绩管理系统逻辑
sysyem.c: 学生成绩管理系统相关函数功能的实现
systemt.h: 关于学生成绩管理系统相关的函数声明,符号声明,头文件包含
完整代码:可直接运行
详细步骤和解析均在代码注释里
1. test.c
/*
项目名称:学生成绩管理系统
功能:
1. 学生成绩录入
2. 学生成绩查询
3. 学生成绩排序
4. 学生成绩修改
5. 学生成绩删除
6. 学生成绩打印
以文件保存输入的信息
*/
#include "system.h"
void Menu() //菜单
{
printf("*******************学生成绩管理系统*******************\n");
printf("********** 1. 学生成绩录入 2. 学生成绩查询 **********\n");
printf("********** 3. 学生成绩排序 4. 学生成绩修改 **********\n");
printf("********** 5. 学生成绩删除 6. 学生成绩打印 **********\n");
printf("********** 0.保存信息并退出系统 **********\n");
printf("*******************学生成绩管理系统*******************\n");
}
int main()
{
int input = 0;
System sys = { 0 }; //创建结构体变量
InitSystem(&sys); //初始化学生成绩管理系统
do
{
Menu(); //菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case EXIT:
SaveSystem(&sys); //保存系统
DestroySystem(&sys); //释放系统空间
printf("已保存信息并退出系统\n");
break;
case ADD:
AddSystem(&sys); //学生成绩录入
break;
case SEARCH:
SearchSystem(&sys); //学生成绩查找
break;
case SORT:
SortSystem(&sys); //学生成绩排序
break;
case MODIFY:
ModifySystem(&sys); //学生成绩修改
break;
case DEL:
DelSystem(&sys); //学生成绩删除
break;
case PRINT:
PrintSystem(&sys); //学生成绩打印
break;
default:
printf("非法操作,请重新输入\n");
break;
}
} while (input);
return 0;
}
2. system.c
#include "system.h"
//检查是否增容
void CheckCapacity(System* ps)
{
if (ps->sz == ps->capacity) //判断有效长度是否等于最大容量
{
Stu* ptr = (Stu*)realloc(ps->data, (ps->capacity + ADD_CAPACITY) * sizeof(Stu)); //新开辟动态空间
if (ptr == NULL)
{
perror("CheckCapacity"); //报错
return; //返回上一函数
}
ps->data = ptr; //接收新开辟的动态空间
ps->capacity = ps->capacity + ADD_CAPACITY; //容量增加
printf("增容成功\n");
}
}
//加载学生成绩管理系统
void LoadSystem(System* ps)
{
FILE* pf = fopen("system.txt", "r"); //以读的方式打开该指定文件
if (pf == NULL)
{
perror("LoadSystem"); //报错
return; //返回上一函数
}
Stu t = { 0 }; //建立结构体变量以代接收文件内容
while (fread(&t, sizeof(Stu), 1, pf)) //接收文件内容
{
CheckCapacity(ps); //检查是否需要增容
ps->data[ps->sz] = t; //系统接收文件内容
ps->sz++; //每接收一次内容有效长度自加1
}
fclose(pf); //关闭该文件
pf = NULL;
}
//初始化学生成绩管理系统
void InitSystem(System* ps)
{
ps->data = (Stu*)calloc(INIT_CAPACITY, sizeof(Stu)); //开辟动态空间并置0
if (ps->data == NULL)
{
perror("InitSystem"); //报错
return; //返回上一函数
}
ps->sz = 0; //初始化有效长度
ps->capacity = INIT_CAPACITY; //初始化最大容量
LoadSystem(ps); //加载学生成绩管理系统
}
//学生成绩录入
void AddSystem(System* ps)
{
CheckCapacity(ps); //检查是否需要增容
printf("请输入学生姓名:>"); //一连串输入信息
scanf("%s", ps->data[ps->sz].name);
printf("请输入学生学号:>");
scanf("%s", ps->data[ps->sz].num);
printf("请输入语文成绩:>");
scanf("%d", &ps->data[ps->sz].chinese);
printf("请输入数学成绩:>");
scanf("%d", &ps->data[ps->sz].math);
printf("请输入英语成绩:>");
scanf("%d", &ps->data[ps->sz].english);
printf("请输入专业成绩:>");
scanf("%d", &ps->data[ps->sz].profession);
ps->data[ps->sz].sum = //计算该学生总分
ps->data[ps->sz].chinese + ps->data[ps->sz].math + ps->data[ps->sz].english + ps->data[ps->sz].profession;
ps->data[ps->sz].aver = ps->data[ps->sz].sum / 4.0; //计算该同学平均分
ps->sz++; //有效长度自加1
printf("增加学生成绩成功\n");
}
//学生成绩打印
void PrintSystem(System* ps)
{
printf("%-20s\t%-20s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\n", //打印标题栏目
"姓名", "学号", "语文", "数学", "英语", "专业", "总分", "平均分");
int i = 0;
for (i = 0; i < ps->sz; i++) //打印全部学生成信息
{
printf("%-20s\t%-20s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%.2f\n",
ps->data[i].name,
ps->data[i].num,
ps->data[i].chinese,
ps->data[i].math,
ps->data[i].english,
ps->data[i].profession,
ps->data[i].sum,
ps->data[i].aver);
}
}
//保存系统
void SaveSystem(System* ps)
{
FILE* pf = fopen("system.txt", "w"); //以读取的方式打开指定文件
if (pf == NULL)
{
perror("SaveSystem"); //报错
return; //返回上一函数
}
int i = 0;
for (i = 0; i < ps->sz; i++) //输出系统全部信息到该文件
{
fwrite(ps->data + i, sizeof(Stu), 1, pf);
}
fclose(pf); //关闭文件
pf = NULL;
}
//系统空间释放
void DestroySystem(System* ps)
{
free(ps->data); //释放开辟的动态空间
ps->data = NULL;
ps->sz = 0; //有效长度置0
ps->capacity = 0; //最大容量置0
}
//查找学生
static int Find(System* ps) //静态static 该函数只在本文件使用
{
int input = 0, i = 0;
while (1)
{
printf("===== 1. 按学生姓名查找 =====\n");
printf("===== 2. 按学生学号查找 =====\n");
printf("请选择:>");
scanf("%d", &input);
if (input == 1) //按学生姓名查找
{
char name[MAX_NAME] = { 0 }; //创建字符数组以代接收字符串
printf("请输入学生姓名:>");
scanf("%s", name);
for (i = 0; i < ps->sz; i++)
{
if (strcmp(ps->data[i].name, name) == 0) //查找该名字是否存在
{
return i; //名字存在时返回其序号
}
}
return -1; //名字不存在则返回-1
}
else if (input == 2) //按学生学号查找
{
char num[MAX_NUM] = { 0 }; //创建字符数组以代接收字符串
printf("请输入学生学号:>");
scanf("%s", num);
for (i = 0; i < ps->sz; i++)
{
if (strcmp(ps->data[i].num, num) == 0) //查找该学号是否存在
{
return i; //学号存在时返回其序号
}
}
return -1; //学号不存在则返回-1
}
else
printf("非法输入,请重新输入\n");
}
}
//学生成绩查找
void SearchSystem(System* ps)
{
int pos = Find(ps); //查找学生是否存在
if (pos == -1)
{
printf("查无此人\n");
return; //返回上一函数
}
printf("%-20s\t%-20s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\n",
"姓名", "学号", "语文", "数学", "英语", "专业", "总分", "平均分"); //打印标题栏目
printf("%-20s\t%-20s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%.2f\n", //打印该学生所有成绩信息
ps->data[pos].name,
ps->data[pos].num,
ps->data[pos].chinese,
ps->data[pos].math,
ps->data[pos].english,
ps->data[pos].profession,
ps->data[pos].sum,
ps->data[pos].aver);
}
//学生成绩修改
void ModifySystem(System* ps)
{
int pos = Find(ps); //查找学生是否存在
if (pos == -1)
{
printf("查无此人\n");
return; //返回上一函数
}
printf("请修改学生姓名:>"); //一连串修改该学生成绩信息
scanf("%s", ps->data[pos].name);
printf("请修改学生学号:>");
scanf("%s", ps->data[pos].num);
printf("请修改语文成绩:>");
scanf("%d", &ps->data[pos].chinese);
printf("请修改数学成绩:>");
scanf("%d", &ps->data[pos].math);
printf("请修改英语成绩:>");
scanf("%d", &ps->data[pos].english);
printf("请修改专业成绩:>");
scanf("%d", &ps->data[pos].profession);
ps->data[pos].sum = //计算修改后的总分
ps->data[pos].chinese + ps->data[pos].math + ps->data[pos].english + ps->data[pos].profession;
ps->data[pos].aver = ps->data[pos].sum / 4.0; //计算修改后的平均分
printf("学生成绩修改成功\n");
}
//学生成绩删除
void DelSystem(System* ps)
{
int pos = Find(ps); //查找学生是否存在
if (pos == -1)
{
printf("查无此人\n");
return; //返回上一函数
}
int i = 0;
for (i = pos; i < ps->sz - 1; i++) //删除该学生后全部学生的排序
{
ps->data[i] = ps->data[i + 1];
}
ps->sz--; //有效长度自减1
printf("学生成绩删除成功\n");
}
//冒泡排序法 按语文由高到低排序 静态static,该函数只在本文件使用
static void Sort1(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].chinese < ps->data[j + 1].chinese)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已按语文由高到低排序\n");
PrintSystem(ps);
}
//冒泡排序法 按数学由高到低排序 静态static,该函数只在本文件使用
static void Sort2(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].math < ps->data[j + 1].math)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已按数学由高到低排序\n");
PrintSystem(ps);
}
//冒泡排序法 按英语由高到低排序 静态static,该函数只在本文件使用
static void Sort3(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].english < ps->data[j + 1].english)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已按英语由高到低排序\n");
PrintSystem(ps);
}
//冒泡排序法 按专业由高到低排序 静态static,该函数只在本文件使用
static void Sort4(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].profession < ps->data[j + 1].profession)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已按专业由高到低排序\n");
PrintSystem(ps);
}
//冒泡排序法 按总分由高到低排序 静态static,该函数只在本文件使用
static void Sort5(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].sum < ps->data[j + 1].sum)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已总分由高到低排序\n");
PrintSystem(ps);
}
//学生成绩排序
void SortSystem(System* ps)
{
//回调函数(转移表) 创建函数指针数组指向6个 System* 类型的函数
void (*Sort[6])(System* ps) = { NULL, Sort1, Sort2, Sort3, Sort4, Sort5 };
int input = 0;
printf("===== 1. 按语文由高到低排序 =====\n");
printf("===== 2. 按数学由高到低排序 =====\n");
printf("===== 3. 按英语由高到低排序 =====\n");
printf("===== 4. 按专业由高到低排序 =====\n");
printf("===== 5. 按总分由高到低排序 =====\n");
printf("请选择:>");
scanf("%d", &input);
if (1 <= input && input <= 5)
{
Sort[input](ps); //使用回调函数(转移表)
}
else
printf("非法操作,已返回上一界面\n");
}
3. system.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NAME 20 //设置学生名字最大长度
#define MAX_NUM 20 //设置学生学号最大长度
#define INIT_CAPACITY 3 //设置初始化的容量
#define ADD_CAPACITY 2 //设置每次增容的容量
enum Option //枚举
{
EXIT, //0
ADD, //1
SEARCH,//2
SORT, //3
MODIFY,//4
DEL, //5
PRINT //6
};
typedef struct Stu //自定义结构体类型Stu
{
char name[MAX_NAME];//学生名字
char num[MAX_NUM]; //学生学号
int chinese; //语文
int math; //数学
int english; //英语
int profession; //专业
int sum; //总分
float aver; //平均分
}Stu;
typedef struct System //自定义结构体类型System
{
Stu* data; //系统学生信息
int sz; //系统学生信息有效长度
int capacity;//系统学生信息容量
}System;
void CheckCapacity(System* ps); //检查是否增容
void LoadSystem(System* ps); //加载学生成绩管理系统
void InitSystem(System* ps); //初始化学生成绩管理系统
void AddSystem(System* ps); //学生成绩录入
void PrintSystem(System* ps); //学生成绩打印
void SaveSystem(System* ps); //保存系统
void DestroySystem(System* ps); //释放系统空间
void SearchSystem(System* ps); //学生成绩查找
void DelSystem(System* ps); //学生成绩删除
void ModifySystem(System* ps); //学生成绩修改
void SortSystem(System* ps); //学生成绩排序
4. 完整代码
/*
项目名称:学生成绩管理系统
功能:
1. 学生成绩录入
2. 学生成绩查询
3. 学生成绩排序
4. 学生成绩修改
5. 学生成绩删除
6. 学生成绩打印
以文件保存输入的信息
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NAME 20 //设置学生名字最大长度
#define MAX_NUM 20 //设置学生学号最大长度
#define INIT_CAPACITY 3 //设置初始化的容量
#define ADD_CAPACITY 2 //设置每次增容的容量
enum Option //枚举
{
EXIT, //0
ADD, //1
SEARCH,//2
SORT, //3
MODIFY,//4
DEL, //5
PRINT //6
};
typedef struct Stu //自定义结构体类型Stu
{
char name[MAX_NAME];//学生名字
char num[MAX_NUM]; //学生学号
int chinese; //语文
int math; //数学
int english; //英语
int profession; //专业
int sum; //总分
float aver; //平均分
}Stu;
typedef struct System //自定义结构体类型System
{
Stu* data; //系统学生信息
int sz; //系统学生信息有效长度
int capacity;//系统学生信息容量
}System;
void CheckCapacity(System* ps); //检查是否增容
void LoadSystem(System* ps); //加载学生成绩管理系统
void InitSystem(System* ps); //初始化学生成绩管理系统
void AddSystem(System* ps); //学生成绩录入
void PrintSystem(System* ps); //学生成绩打印
void SaveSystem(System* ps); //保存系统
void DestroySystem(System* ps); //释放系统空间
void SearchSystem(System* ps); //学生成绩查找
void DelSystem(System* ps); //学生成绩删除
void ModifySystem(System* ps); //学生成绩修改
void SortSystem(System* ps); //学生成绩排序
void Menu() //菜单
{
printf("*******************学生成绩管理系统*******************\n");
printf("********** 1. 学生成绩录入 2. 学生成绩查询 **********\n");
printf("********** 3. 学生成绩排序 4. 学生成绩修改 **********\n");
printf("********** 5. 学生成绩删除 6. 学生成绩打印 **********\n");
printf("********** 0.保存信息并退出系统 **********\n");
printf("*******************学生成绩管理系统*******************\n");
}
int main()
{
int input = 0;
System sys = { 0 }; //创建结构体变量
InitSystem(&sys); //初始化学生成绩管理系统
do
{
Menu(); //菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case EXIT:
SaveSystem(&sys); //保存系统
DestroySystem(&sys); //释放系统空间
printf("已保存信息并退出系统\n");
break;
case ADD:
AddSystem(&sys); //学生成绩录入
break;
case SEARCH:
SearchSystem(&sys); //学生成绩查找
break;
case SORT:
SortSystem(&sys); //学生成绩排序
break;
case MODIFY:
ModifySystem(&sys); //学生成绩修改
break;
case DEL:
DelSystem(&sys); //学生成绩删除
break;
case PRINT:
PrintSystem(&sys); //学生成绩打印
break;
default:
printf("非法操作,请重新输入\n");
break;
}
} while (input);
return 0;
}
//检查是否增容
void CheckCapacity(System* ps)
{
if (ps->sz == ps->capacity) //判断有效长度是否等于最大容量
{
Stu* ptr = (Stu*)realloc(ps->data, (ps->capacity + ADD_CAPACITY) * sizeof(Stu)); //新开辟动态空间
if (ptr == NULL)
{
perror("CheckCapacity"); //报错
return; //返回上一函数
}
ps->data = ptr; //接收新开辟的动态空间
ps->capacity = ps->capacity + ADD_CAPACITY; //容量增加
printf("增容成功\n");
}
}
//加载学生成绩管理系统
void LoadSystem(System* ps)
{
FILE* pf = fopen("system.txt", "r"); //以读的方式打开该指定文件
if (pf == NULL)
{
perror("LoadSystem"); //报错
return; //返回上一函数
}
Stu t = { 0 }; //建立结构体变量以代接收文件内容
while (fread(&t, sizeof(Stu), 1, pf)) //接收文件内容
{
CheckCapacity(ps); //检查是否需要增容
ps->data[ps->sz] = t; //系统接收文件内容
ps->sz++; //每接收一次内容有效长度自加1
}
fclose(pf); //关闭该文件
pf = NULL;
}
//初始化学生成绩管理系统
void InitSystem(System* ps)
{
ps->data = (Stu*)calloc(INIT_CAPACITY, sizeof(Stu)); //开辟动态空间并置0
if (ps->data == NULL)
{
perror("InitSystem"); //报错
return; //返回上一函数
}
ps->sz = 0; //初始化有效长度
ps->capacity = INIT_CAPACITY; //初始化最大容量
LoadSystem(ps); //加载学生成绩管理系统
}
//学生成绩录入
void AddSystem(System* ps)
{
CheckCapacity(ps); //检查是否需要增容
printf("请输入学生姓名:>"); //一连串输入信息
scanf("%s", ps->data[ps->sz].name);
printf("请输入学生学号:>");
scanf("%s", ps->data[ps->sz].num);
printf("请输入语文成绩:>");
scanf("%d", &ps->data[ps->sz].chinese);
printf("请输入数学成绩:>");
scanf("%d", &ps->data[ps->sz].math);
printf("请输入英语成绩:>");
scanf("%d", &ps->data[ps->sz].english);
printf("请输入专业成绩:>");
scanf("%d", &ps->data[ps->sz].profession);
ps->data[ps->sz].sum = //计算该学生总分
ps->data[ps->sz].chinese + ps->data[ps->sz].math + ps->data[ps->sz].english + ps->data[ps->sz].profession;
ps->data[ps->sz].aver = ps->data[ps->sz].sum / 4.0; //计算该同学平均分
ps->sz++; //有效长度自加1
printf("增加学生成绩成功\n");
}
//学生成绩打印
void PrintSystem(System* ps)
{
printf("%-20s\t%-20s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\n", //打印标题栏目
"姓名", "学号", "语文", "数学", "英语", "专业", "总分", "平均分");
int i = 0;
for (i = 0; i < ps->sz; i++) //打印全部学生成信息
{
printf("%-20s\t%-20s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%.2f\n",
ps->data[i].name,
ps->data[i].num,
ps->data[i].chinese,
ps->data[i].math,
ps->data[i].english,
ps->data[i].profession,
ps->data[i].sum,
ps->data[i].aver);
}
}
//保存系统
void SaveSystem(System* ps)
{
FILE* pf = fopen("system.txt", "w"); //以读取的方式打开指定文件
if (pf == NULL)
{
perror("SaveSystem"); //报错
return; //返回上一函数
}
int i = 0;
for (i = 0; i < ps->sz; i++) //输出系统全部信息到该文件
{
fwrite(ps->data + i, sizeof(Stu), 1, pf);
}
fclose(pf); //关闭文件
pf = NULL;
}
//系统空间释放
void DestroySystem(System* ps)
{
free(ps->data); //释放开辟的动态空间
ps->data = NULL;
ps->sz = 0; //有效长度置0
ps->capacity = 0; //最大容量置0
}
//查找学生
static int Find(System* ps) //静态static 该函数只在本文件使用
{
int input = 0, i = 0;
while (1)
{
printf("===== 1. 按学生姓名查找 =====\n");
printf("===== 2. 按学生学号查找 =====\n");
printf("请选择:>");
scanf("%d", &input);
if (input == 1) //按学生姓名查找
{
char name[MAX_NAME] = { 0 }; //创建字符数组以代接收字符串
printf("请输入学生姓名:>");
scanf("%s", name);
for (i = 0; i < ps->sz; i++)
{
if (strcmp(ps->data[i].name, name) == 0) //查找该名字是否存在
{
return i; //名字存在时返回其序号
}
}
return -1; //名字不存在则返回-1
}
else if (input == 2) //按学生学号查找
{
char num[MAX_NUM] = { 0 }; //创建字符数组以代接收字符串
printf("请输入学生学号:>");
scanf("%s", num);
for (i = 0; i < ps->sz; i++)
{
if (strcmp(ps->data[i].num, num) == 0) //查找该学号是否存在
{
return i; //学号存在时返回其序号
}
}
return -1; //学号不存在则返回-1
}
else
printf("非法输入,请重新输入\n");
}
}
//学生成绩查找
void SearchSystem(System* ps)
{
int pos = Find(ps); //查找学生是否存在
if (pos == -1)
{
printf("查无此人\n");
return; //返回上一函数
}
printf("%-20s\t%-20s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\n",
"姓名", "学号", "语文", "数学", "英语", "专业", "总分", "平均分"); //打印标题栏目
printf("%-20s\t%-20s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%.2f\n", //打印该学生所有成绩信息
ps->data[pos].name,
ps->data[pos].num,
ps->data[pos].chinese,
ps->data[pos].math,
ps->data[pos].english,
ps->data[pos].profession,
ps->data[pos].sum,
ps->data[pos].aver);
}
//学生成绩修改
void ModifySystem(System* ps)
{
int pos = Find(ps); //查找学生是否存在
if (pos == -1)
{
printf("查无此人\n");
return; //返回上一函数
}
printf("请修改学生姓名:>"); //一连串修改该学生成绩信息
scanf("%s", ps->data[pos].name);
printf("请修改学生学号:>");
scanf("%s", ps->data[pos].num);
printf("请修改语文成绩:>");
scanf("%d", &ps->data[pos].chinese);
printf("请修改数学成绩:>");
scanf("%d", &ps->data[pos].math);
printf("请修改英语成绩:>");
scanf("%d", &ps->data[pos].english);
printf("请修改专业成绩:>");
scanf("%d", &ps->data[pos].profession);
ps->data[pos].sum = //计算修改后的总分
ps->data[pos].chinese + ps->data[pos].math + ps->data[pos].english + ps->data[pos].profession;
ps->data[pos].aver = ps->data[pos].sum / 4.0; //计算修改后的平均分
printf("学生成绩修改成功\n");
}
//学生成绩删除
void DelSystem(System* ps)
{
int pos = Find(ps); //查找学生是否存在
if (pos == -1)
{
printf("查无此人\n");
return; //返回上一函数
}
int i = 0;
for (i = pos; i < ps->sz - 1; i++) //删除该学生后全部学生的排序
{
ps->data[i] = ps->data[i + 1];
}
ps->sz--; //有效长度自减1
printf("学生成绩删除成功\n");
}
//冒泡排序法 按语文由高到低排序 静态static,该函数只在本文件使用
static void Sort1(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].chinese < ps->data[j + 1].chinese)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已按语文由高到低排序\n");
PrintSystem(ps);
}
//冒泡排序法 按数学由高到低排序 静态static,该函数只在本文件使用
static void Sort2(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].math < ps->data[j + 1].math)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已按数学由高到低排序\n");
PrintSystem(ps);
}
//冒泡排序法 按英语由高到低排序 静态static,该函数只在本文件使用
static void Sort3(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].english < ps->data[j + 1].english)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已按英语由高到低排序\n");
PrintSystem(ps);
}
//冒泡排序法 按专业由高到低排序 静态static,该函数只在本文件使用
static void Sort4(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].profession < ps->data[j + 1].profession)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已按专业由高到低排序\n");
PrintSystem(ps);
}
//冒泡排序法 按总分由高到低排序 静态static,该函数只在本文件使用
static void Sort5(System* ps)
{
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j].sum < ps->data[j + 1].sum)
{
Stu t = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = t;
}
}
}
printf("已总分由高到低排序\n");
PrintSystem(ps);
}
//学生成绩排序
void SortSystem(System* ps)
{
//回调函数(转移表) 创建函数指针数组指向6个 System* 类型的函数
void (*Sort[6])(System * ps) = { NULL, Sort1, Sort2, Sort3, Sort4, Sort5 };
int input = 0;
printf("===== 1. 按语文由高到低排序 =====\n");
printf("===== 2. 按数学由高到低排序 =====\n");
printf("===== 3. 按英语由高到低排序 =====\n");
printf("===== 4. 按专业由高到低排序 =====\n");
printf("===== 5. 按总分由高到低排序 =====\n");
printf("请选择:>");
scanf("%d", &input);
if (1 <= input && input <= 5)
{
Sort[input](ps); //使用回调函数(转移表)
}
else
printf("非法操作,已返回上一界面\n");
}
5. 测试示例