c语言-学生成绩管理系统

项目名称:学生成绩管理系统
功能:

  1. 学生成绩录入
  2. 学生成绩查询
  3. 学生成绩排序
  4. 学生成绩修改
  5. 学生成绩删除
  6. 学生成绩打印

文件:
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. 测试示例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值