学生成绩管理系统C语言,删除,查找,新增,排序

发布于:2023-07-04 ⋅ 阅读:(145) ⋅ 点赞:(0)

需求如下:

1.按各门课成绩排序
2.计算每个人的平均成绩
3.统计各科的平均分,最高分,最低分,不及格人数,各分段人数
4.五分制,添加一个平均绩点
5.根据学生姓名查询各科成绩,重名则全部输出
6.根据学生的学号查询
7.添加一个新的学生
8.删除一个学生

准备文件:

需要将此文件和源.cpp文件放到一个文件夹里,写路径时方便。

源代码在下面,篇幅有点长,望读者耐心浏览。

 测试结果:

 

 

 

 

 

 

代码:

#define EXAMPLE_MACRO_NAME//此代码运行在vs2019中  为防止scanf()等函数出错
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int count = 0;//学生序号
//定义结构体数据
struct student {
	int s_id;//学号
	char s_name[10];//姓名
	int s_math;//高数
	int s_C;//C语言
	int s_DateStructure;//数据结构
	int s_English;//英语
	int s_avg;//每个学生平均分
}S[10];

int j;//学生个数
void open_file()
{
	FILE* fp;
	int i;
	if ((fp = fopen("input.txt", "r")) == NULL)
	{
		printf("file open failed.");
		exit(0);//退出程序(结束程序)
	}

	j = 0;	
	while (!feof(fp))  
	{		
		fscanf(fp, "%d,%d,%d,%d,%d,%s", &S[j].s_id,&S[j].s_math, &S[j].s_C, &S[j].s_DateStructure, &S[j].s_English, S[j].s_name);
		
		j++;
	}  
	j--;
	fclose(fp);//关闭文件
}

//按照各科成绩排序
void s_sort()
{
	open_file();
	printf("按照高数进行排序:\n");
	for (int i = 0; i < j; i++) 
	{
		for (int k = 0; k < j - 1 - i; k++)
		{
			if (S[k].s_math > S[k + 1].s_math)
			{
				struct student t = S[k];
				S[k] = S[k + 1];
				S[k + 1] = t;

			}
		}
	}
	count = 0;
	printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
	for (int i = 0; i < j; i++)  //依次打印每一行学生数据,共j条,存在S[0...j-1]中
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
		count++;
	}


	printf("按照C语言进行排序:\n");
	for (int i = 0; i < j; i++)
	{
		for (int k = 0; k < j - 1 - i; k++)
		{
			if (S[k].s_C > S[k + 1].s_C)
			{
				struct student t = S[k];
				S[k] = S[k + 1];
				S[k + 1] = t;

			}
		}
	}
	count = 0;
	printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
	for (int i = 0; i < j; i++)  //依次打印每一行学生数据,共j条,存在S[0...j-1]中
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
		count++;
	}


	printf("按照数据结构进行排序:\n");
	for (int i = 0; i < j; i++)
	{
		for (int k = 0; k < j - 1 - i; k++)
		{
			if (S[k].s_DateStructure > S[k + 1].s_DateStructure)
			{
				struct student t = S[k];
				S[k] = S[k + 1];
				S[k + 1] = t;

			}
		}
	}
	count = 0;
	printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
	for (int i = 0; i < j; i++)  //依次打印每一行学生数据,共j条,存在S[0...j-1]中
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
		count++;
	}


	printf("按照英语进行排序:\n");
	for (int i = 0; i < j; i++)
	{
		for (int k = 0; k < j - 1 - i; k++)
		{
			if (S[k].s_English > S[k + 1].s_English)
			{
				struct student t = S[k];
				S[k] = S[k + 1];
				S[k + 1] = t;

			}
		}
	}
	count = 0;
	printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
	for (int i = 0; i < j; i++)  //依次打印每一行学生数据,共j条,存在S[0...j-1]中
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
		count++;
	}
	


}

//按照平均成绩排序
void s_sort_avg()
{
	open_file();
	printf("按照平均成绩进行排序:\n");
	for (int i = 0; i < j; i++)
	{
		S[i].s_avg = (S[i].s_math + S[i].s_C + S[i].s_DateStructure + S[i].s_English) / 4;
	}
	for (int i = 0; i < j; i++)
	{
		for (int k = 0; k < j - 1 - i; k++)
		{
			if (S[k].s_avg > S[k + 1].s_avg)
			{
				struct student t = S[k];
				S[k] = S[k + 1];
				S[k + 1] = t;

			}
		}
	}
	count = 0;
	printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\t平均分\n");
	for (int i = 0; i < j; i++)  //依次打印每一行学生数据,共j条,存在S[0...j-1]中
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		printf("%d\t%d\t%s\t%d\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English,S[i].s_avg);
		count++;
	}
}

//统计各科的平均分,最高分,最低分,不及格人数,各分段人数
void s_statistics()
{
	open_file();	
	int s_max, s_min, s_flunk = 0, s_60_69 = 0, s_70_79 = 0, s_80_89 = 0, s_90_100 = 0;
	int avg;
	s_max = S[0].s_math, s_min = S[0].s_math, avg = 0;
	for (int i = 0; i < j; i++)
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		if (s_max < S[i].s_math)
		{
			s_max = S[i].s_math;
		}

		if (s_min > S[i].s_math)
		{
			s_min = S[i].s_math;
		}

		if (S[i].s_math < 60)
		{
			s_flunk++;
		}

		if (S[i].s_math >= 60 && S[i].s_math <= 69)
		{
			s_60_69++;
		}

		if (S[i].s_math >= 70 && S[i].s_math <= 79)
		{
			s_70_79++;
		}

		if (S[i].s_math >= 80 && S[i].s_math <= 89)
		{
			s_80_89++;
		}

		if (S[i].s_math >= 90 && S[i].s_math <= 100)
		{
			s_90_100++;
		}
		avg += S[i].s_math;
	}
	avg /= j;
	printf("高数平均分:%d\t   最高分:%d\t最低分:%d\t不及格人数:%d\t60-69的人数有:%d\t70-79的人数有:%d\t80-89的人数有:%d\t90-100的人数有:%d\n", avg, s_max, s_min, s_flunk, s_60_69, s_70_79, s_80_89, s_90_100);

	s_flunk = 0, s_60_69 = 0, s_70_79 = 0, s_80_89 = 0, s_90_100 = 0;
	s_max = S[0].s_C, s_min = S[0].s_C, avg = 0;
	for (int i = 0; i < j; i++)
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		if (s_max < S[i].s_C)
		{
			s_max = S[i].s_C;
		}

		if (s_min > S[i].s_C)
		{
			s_min = S[i].s_C;
		}

		if (S[i].s_C < 60)
		{
			s_flunk++;
		}

		if (S[i].s_C >= 60 && S[i].s_C <= 69)
		{
			s_60_69++;
		}

		if (S[i].s_C >= 70 && S[i].s_C <= 79)
		{
			s_70_79++;
		}

		if (S[i].s_C >= 80 && S[i].s_C <= 89)
		{
			s_80_89++;
		}

		if (S[i].s_C >= 90 && S[i].s_C <= 100)
		{
			s_90_100++;
		}
		avg += S[i].s_C;
	}
	avg /= j;
	printf("C语言平均分:%d\t   最高分:%d\t最低分:%d\t不及格人数:%d\t60-69的人数有:%d\t70-79的人数有:%d\t80-89的人数有:%d\t90-100的人数有:%d\n", avg, s_max, s_min, s_flunk, s_60_69, s_70_79, s_80_89, s_90_100);

	s_flunk = 0, s_60_69 = 0, s_70_79 = 0, s_80_89 = 0, s_90_100 = 0;
	s_max = S[0].s_DateStructure, s_min = S[0].s_DateStructure, avg = 0;
	for (int i = 0; i < j; i++)
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		if (s_max < S[i].s_DateStructure)
		{
			s_max = S[i].s_DateStructure;
		}

		if (s_min > S[i].s_DateStructure)
		{
			s_min = S[i].s_DateStructure;
		}

		if (S[i].s_DateStructure < 60)
		{
			s_flunk++;
		}

		if (S[i].s_DateStructure >= 60 && S[i].s_DateStructure <= 69)
		{
			s_60_69++;
		}

		if (S[i].s_DateStructure >= 70 && S[i].s_DateStructure <= 79)
		{
			s_70_79++;
		}

		if (S[i].s_DateStructure >= 80 && S[i].s_DateStructure <= 89)
		{
			s_80_89++;
		}

		if (S[i].s_DateStructure >= 90 && S[i].s_DateStructure <= 100)
		{
			s_90_100++;
		}
		avg += S[i].s_DateStructure;

	}
	avg /= j;
	printf("数据结构平均分:%d  最高分:%d\t最低分:%d\t不及格人数:%d\t60-69的人数有:%d\t70-79的人数有:%d\t80-89的人数有:%d\t90-100的人数有:%d\n", avg, s_max, s_min, s_flunk, s_60_69, s_70_79, s_80_89, s_90_100);

	s_flunk = 0, s_60_69 = 0, s_70_79 = 0, s_80_89 = 0, s_90_100 = 0;
	s_max = S[0].s_English, s_min = S[0].s_English, avg = 0;
	for (int i = 0; i < j; i++)
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		if (s_max < S[i].s_English)
		{
			s_max = S[i].s_English;
		}

		if (s_min > S[i].s_English)
		{
			s_min = S[i].s_English;
		}

		if (S[i].s_English < 60)
		{
			s_flunk++;
		}

		if (S[i].s_English >= 60 && S[i].s_English <= 69)
		{
			s_60_69++;
		}

		if (S[i].s_English >= 70 && S[i].s_English <= 79)
		{
			s_70_79++;
		}

		if (S[i].s_English >= 80 && S[i].s_English <= 89)
		{
			s_80_89++;
		}

		if (S[i].s_English >= 90 && S[i].s_English <= 100)
		{
			s_90_100++;
		}
		avg += S[i].s_English;
	}
	avg /= j;
	printf("英语平均分:%d\t   最高分:%d\t最低分:%d\t不及格人数:%d\t60-69的人数有:%d\t70-79的人数有:%d\t80-89的人数有:%d\t90-100的人数有:%d\n", avg, s_max, s_min, s_flunk, s_60_69, s_70_79, s_80_89, s_90_100);
}

//将每个人的百分制换出五分制,并在学生数组中添加一个平均绩点,记录五分制的平均绩点信息保留2位小数
void s_five()
{
	open_file();
	for (int i = 0; i < j; i++)
	{
		S[i].s_avg = (S[i].s_math + S[i].s_C + S[i].s_DateStructure + S[i].s_English) / 4;
	}
	for (int i = 0; i < j; i++)
	{
		for (int k = 0; k < j - 1 - i; k++)
		{
			if (S[k].s_avg > S[k + 1].s_avg)
			{
				struct student t = S[k];
				S[k] = S[k + 1];
				S[k + 1] = t;

			}
		}
	}
	count = 0;
	printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\t平均分\n");
	for (int i = 0; i < j; i++)  //依次打印每一行学生数据,共j条,存在S[0...j-1]中
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		double s = S[i].s_math *= 100;;
		double c = S[i].s_C *= 100;
		double d = S[i].s_DateStructure *= 100;
		double e = S[i].s_English *= 100;
		double a = S[i].s_avg *= 100;
		printf("%d\t%d\t%s\t%.2lf\t%.2lf\t\t%.2lf\t%.2lf\t%.2lf\n", count + 1, S[i].s_id, S[i].s_name, s/2000,c/2000,d/2000,e/2000,a/2000);
		count++;
	}
}

//根据学生姓名查询各科成绩,重名则全部输出
void enquire_name()
{
	open_file();
	char name[10];
	printf("输入需要查询的学生姓名\n");
	scanf("%s", name);
	int num = 0;
	for (int i = 0; i < j; i++)
	{
		if (S[i].s_id == 0)
		{
			continue;
		}
		if (strcmp(name,S[i].s_name)==0)
		{
			printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");

			printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", num + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
			num++;
		}
	}
	if (num == 0)
	{
		printf("该学生不存在\n");
	}
}


//根据学生的学号查询各科成绩
void enquire_id()
{
	open_file();
	int id=0;
	count = 0;
	printf("输入需要查询的学生学号\n");
	scanf("%d", &id);
	if (id == 0)
	{
		printf("该学号不存在或已被删除\n");
	}
	for (int i = 0; i < j; i++)
	{
		if (id==S[i].s_id)
		{
			printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
			printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
			count++;
		}
	}
	if (count == 0)
	{
		printf("该学生不存在!\n");
	}
}

//添加一个新的学生到数组里
void add_s()
{
	open_file();
	FILE* fp;

	if ((fp = fopen("input.txt", "a")) == NULL)
	{
		printf("file open failed.");
		exit(0);//退出程序(结束程序)
	}

	int i;
	int num = 0;
	printf("需要录入几个学生的信息?\n");
	scanf("%d", &num);



	for (i = 0; i < num; i++)  //往文件中写入3个学生信息  //输入成绩时切换至英文输入 ','
	{
		int flag = 0;//记录录入的学号是否存在
		int id = 0;
		printf("正在录入第%d个学生信息\n", i + 1);

		printf("请输入学号\n");

		scanf("%d", &id);
		if (id == 0)
		{
			printf("错误学号请重新输入\n");
			i -= 1;
			continue;
		}
		for (int a = 0; a < j; a++)
		{
			if (id == S[a].s_id)
			{
				printf("该学生已存在,请重新输入\n");
				printf("-----------------------\n");
				i -= 1;
				flag = 1;
				break;
			}
		}
		if (flag == 1)
		{
			continue;
		}
		S[i].s_id = id;
		printf("请输入姓名\n");
		scanf("%s", S[i].s_name);
		printf("请输入高数,C语言,数据结构,英语\n");

		scanf("%d,%d,%d,%d", &S[i].s_math, &S[i].s_C, &S[i].s_DateStructure, &S[i].s_English);// 从键盘输入数据,存入内存中的数组

		fprintf(fp, "%d,%d,%d,%d,%d,%s\n", S[i].s_id, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English, S[i].s_name);//把内存中数组的数据,写入文件中
		printf("本次录入的信息:\n");
		printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");

		printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
	}
	fclose(fp);
}

//删除一个学生
void delete_s()
{
	open_file();

	FILE* fp;

	if ((fp = fopen("input.txt", "r+")) == NULL)
	{
		printf("file open failed.");
		exit(0);//退出程序(结束程序)
	}
	int id = 0;
	int flag = 0;
	printf("请输入要删除学生的学号:\n");
	scanf("%d", &id);
	if (id == 0)
	{
		printf("错误学号请重新输入\n");
	}
	for (int i = 0; i < j ; i++)
	{
		if (id == S[i].s_id)
		{
			S[i].s_id = 0;
			fprintf(fp, "%d,%d,%d,%d,%d,%s\n", S[i].s_id, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English, S[i].s_name);
			flag = 1;
		}
		else
		{
			fprintf(fp, "%d,%d,%d,%d,%d,%s\n", S[i].s_id, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English, S[i].s_name);
		}
		
	}
	if(flag==0)
	{
		printf("该学号不存在\n");
	}
	else
	{
		printf("删除成功!\n");

	}
	fclose(fp);
}


//菜单
void s_menu()
{
	printf("·········学生成绩分析系统········\n");

	printf("\t0.退出\n");
	printf("\t1.按各门课成绩排序并显示\n");
	printf("\t2.计算每个人的平均成绩,按平均成绩(百分制)排序并显示\n");
	printf("\t3.统计各科的平均分,最高分,最低分,不及格人数,各分段人数\n");
	printf("\t4.将每个人的百分制换出五分制,并在学生数组中添加一个平均绩点,记录五分制的平均绩点信息保留2位小数\n");
	printf("\t5.根据学生姓名查询各科成绩,重名则全部输出\n");
	printf("\t6.根据学生的学号查询各科成绩\n");
	printf("\t7.添加一个新的学生到数组里\n");
	printf("\t8.删除一个学生\n\n");
	printf("输入您需要实现的功能的序号:\n");

}

int main()
{
	
	while (true)
	{
		s_menu();

		int select = 0;
		scanf("%d", &select);
		switch (select)
		{
		case 0:
			exit(0);
			break;
		case 1:
			s_sort();
			break;
		case 2:
			s_sort_avg();
			break;
		case 3:
			s_statistics();
			break;
		case 4:
			s_five();
			break;
		case 5:
			enquire_name();
			break;
		case 6:
			enquire_id();
			break;
		case 7:
			add_s();
			break;
		case 8:
			delete_s();
			break;

		default:
			break;
		}
	}
	return 0;
}

 总结:

变量名的命名比较乱,代码冗余,未考虑时间,空间复杂度。

希望能够帮助到读者。

读者可以尝试将其完善,减少代码行数,使用模板,链表来存储数据等等。

本文含有隐藏内容,请 开通VIP 后查看