学期评优方案设计(难度升级版)(中国地质大学【武汉】)

题目:

《C\C++语言课程设计》指导书
一、课程设计概要
项目名称:学期评优方案设计
二、项目背景
已知文本文件f1.txt中存放了某校若干名大一学生的相关信息,具体数据及存放格式为:每行存放一个学生的数据,数据之间用空格分隔(不一定只有一个空格,也可能有多个空格),共有11项,依次为:学号、姓名、专业编号、通识教育课一、通识教育课二、通识教育课三、公共基础课一、公共基础课二、公共基础课三、专业主干课一、专业主干课二等8门课程的成绩。f1.txt文件的格式截图如下。
其中,学号为5位数字字符(可能的最小学号是00001,可能的最大学号是06000,学号不一定是连续的,有的学号可能缺失,因为有的学生中途退学了);姓名为长度不超过10个的英文连续字符;专业编号为二位数字字符,编号从01-50;所有课程成绩均为0-100的整数。
该校的学期评优政策如下:
优秀学生分为两类:极级优秀学生与专业优秀学生。
优秀学生的必备条件:
任何一门通识教育课程成绩如果低于60,任何一门公共基础课成绩如果低于70分,任何一门专业主干课程成绩如果低于80分,出现这三种情况中的任何一种不能当选任何一类优秀学生。
校级优秀学生人数:按全校学生的5%比例评选校级优秀学生,小数部分四舍五入。
专业优秀学生人数:先按专业学生的10%比例评选专业优秀学生,小数部分四舍五入。然后剔除其中已经被评定为校优的学生(剔除后专业优秀学生比例有可能不到10%)。
评定成绩计算方法:通识教育课程不计算入评定成绩,仅仅作为是否具备评优资格的依据。公共基础课成绩的权值为0.8,专业主干课成绩的权值为1.2。计算公式:
评定成绩 = 0.8 * 三门公共基础课的总成绩 + 1.2 * 二门专业主干课程的总成绩。
三、设计内容与步骤
1、能够读取和显示f1文件
设计要求:
编写程序实现读取f1.txt文件并显示文件内容的功能。
设计提示:
(1)建立一个与f1文件格式对应的结构F1,结构成员变量包括:学号、姓名、专业编号、通识教育课一、通识教育课二、通识教育课三、公共基础课一、公共基础课二、公共基础课三、专业主干课一、专业主干课二等8门课程的成绩。
(2)建立f1文件的读取函数Readf1,该函数返回值为布尔型(代表是否成功读取了f1文件),函数参数是F1结构数组的首地址。函数功能是可以把f1文件的内容整体读入F1结构的实例数组,等待进一步处理。(提示对做题用处不大,甚至有误导)
2、能够生成校优秀和专业优秀的评优结果
设计要求:
请编写程序,根据文件f1.txt中的数据,生成评优结果文件f2.txt和f3.txt。文件f2.txt用以只存放评选出来的校级优秀学生的信息,文件f3.txt用以只存放评选出来的专业优秀学生的信息。存放格式为:每行存放一个优秀学生的数据,数据之间用空格分隔,共有13项,依次为:学号、姓名、专业编号、通识教育课一、通识教育课二、通识教育课三、公共基础课一、公共基础课二、公共基础课三、专业主干课一、专业主干课二等8门课程的成绩、评定总成绩、成绩排名(1是第一名、2是第二名,依次类推)。
f2和f3文件中的学号顺序与f1文件相同,不做改变;两文件中的成绩排名一律按评定总成绩排。
评优结果可以显示于屏幕,也可以保存到文件。
设计提示:
(1)从以上要求可知,文件f2和f3的格式只是在f1的文件格式基础上增加了两项:评定总成绩与成绩排名,因此可以建立一个新的结构F2,该结构嵌入一个F1结构类型的实例作为成员变量,并且新增两个成员变量:评定总成绩、成绩排名。
(2)F2结构类型对于f2和f3文件格式都是通用的,所以只需要两个F2的结构数组就可以分别存放校级优秀和专业优秀的评选结果,但是每个结构数组要存储多少元素事先是不知道的,可以考虑使用动态结构数组或结构矢量。
(3)可以设计函数来实现生成评优结果数组和保存成文件的功能。(提示对做题用处不大,甚至有误导)
3、能够生成分专业排序的评优结果
请编写程序,根据步骤2生成的校级优秀和专业优秀评选结果,生成分专业的评优结果文件f4.txt。文件f4.txt用以存放各专业的校级优秀和专业优秀学生信息。存放格式为:每行存放一个优秀学生的数据,数据之间用空格分隔,共有13项,依次为:专业编号、学号、姓名、通识教育课一、通识教育课二、通识教育课三、公共基础课一、公共基础课二、公共基础课三、专业主干课一、专业主干课二等8门课程的成绩、评定总成绩、成绩排名(仍同步骤2采用全校统一排名)、评优结果(校级优秀或专业优秀)。
即文件f4是对f2和f3文件内容的合并,但是f4文件要求按专业编号由小到大的顺序进行排序,而且先排完一个专业的所有优秀学生再排下一个专业的;同一个专业的学生按成绩排名的先后排。
评优结果可以显示于屏幕,也可以保存到文件。
设计提示:
可以设计一个排序函数来实现生成分专业排序的评优结果和保存成文件的功能。(提示对做题用处不大,甚至有误导)
4、评优统计功能
设计要求:
能够统计各个专业的专业总人数、校级优秀占比、专业优秀占比、不具备评优资格的学生人数占比,占比均以该项人数/专业总人数计算,精确到百分比值小数点后两位,例如:某专业的校优占比=该专业的校优人数/该专业的总人数。
能够统计校级优秀学生人数占比最大的专业编号、不具备评优资格人数占比最大的专业编号。
能够统计各个专业优秀学生的信息。
评优结果可以显示于屏幕,也可以保存到文件,文件和屏幕显示格式参考以下例表
专业编号 专业总人数 校级优秀占比 专业优秀占比 无评优资格占比
01 384 3.23% 11.12% 10.44%
02 526 5.64% 9.67% 8.77%
………………………………………………………………………………………
校级优秀占比最大的专业编号是:21
无评优资格占比最大的专业编号是:13
5、评优查询与分析功能
根据学生输入的学号及姓名,查询本人的评优结果是校级优秀、专业优秀还是未评上。(如果输入的学号与姓名不匹配,提示错误信息。如果只输入一项信息,禁止查询。)
对于未被评上校优的学生,能够分析出该学生未被评上校优的最主要原因。未被评上校优的原因有两种情况:无评优资格或虽有资格但成绩排名较低,但无论何种情况其根本原因都在于科目成绩较低。
若该生由于任何一门通识教育课程成绩如果不及格而导致无评优资格,则分数最低的通识教育课程成绩不及格是最主要因素且所占权重为100%;否则若该生任何一门公共基础课成绩如果低于70分,则分数最低的公共基础课成绩低于70分是最主要因素;否则若该生任何一门专业主干课程成绩低于80分,则分数最低的专业主干课程成绩低于80分是最主要因素;否则,公共基础课和专业主干课加权成绩排名在5%之后是主要原因。
评优结果查询与分析结果可以显示于屏幕,也可以保存到文件。
6、其他设计要求
基本要求:所有统计信息即可屏幕显示,也可以文件的形式存盘保存;
系统程序要有合理清晰的界面提示和显示。
程序设计质量和规范性要求:
(1) 合理运用函数、结构、类、文件等封装手段(各种封装手段不要求必须都用,只要合理),使得程序结构清晰、简洁、代码复用性好;
(2) 变量命名有意义,不易混淆,便于查错和可读性好;
(3) 程序缩进格式规范;
(4) 各函数、结构、类、文件等有必要的较为规范的头注释,便于使用;
(5) 复杂函数内部或复杂算法有分段注释语句,脉络思路清晰。

f1.txt:

00002 hqghum 13 67 61 87 80 71 90 99 97
00003 vsrtkj 04 95 71 71 86 74 75 99 94
00004 mznimk 17 94 77 83 83 78 94 80 84
00005 adpooe 28 71 92 80 74 97 93 81 91
00007 pyamye 19 39 97 67 90 82 84 100 80
00009 oksfzk 49 98 88 68 79 56 73 63 87
00012 nuxxzr 38 75 25 77 96 89 89 80 98
00013 iojway 26 74 65 67 95 75 96 85 93
00014 rkdcpw 18 67 79 86 82 80 70 92 80
00015 bmborx 36 71 65 77 81 78 96 99 80
00016 zshklj 15 60 93 97 72 100 76 97 98
00017 biwybx 11 69 80 100 70 83 73 82 94
00020 eeddps 28 72 95 79 36 95 96 90 92
00021 uxmhec 08 89 76 66 76 87 71 94 92
00022 prjbxp 33 60 95 89 82 76 90 94 98
00023 brzmwz 25 61 67 92 85 92 96 96 82

代码:

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
struct StuInfo//学生类型结构体
{
	char num[6];//学号
	char name[11];//姓名
	char majorid[3];//专业号
	int t1;//通识课一
	int t2;//通识课二
	int t3;//通识课三
	int g1;//公共课一
	int g2;//公共课二
	int g3;//公共课三
	int z1;//专业课一
	int z2;//专业课二
	int State[2];// 0号单元true代表专业优秀 1号单元true代表校级优秀
	float averageScore;//综合成绩
	int sumScore;	//八门总成绩
	int sort;
};
struct MajorInfo//专业类型结构体
{
	int allNum;//专业总人数
	int	MjoExcQuota;//专业优秀人数名额
	int numSchExc;//获得校级优秀人数
	int	numMjoExc;//获得专业优秀人数
	int notQualification;//没有资格评优的人数
};
void Init(StuInfo stu[], MajorInfo maj[]);	//初始化结构体数组
bool ReadF1(StuInfo[]);	//读取显示f1
void sumSort(StuInfo stu[], StuInfo temStu[]);//按成绩排序
bool IsValid(StuInfo stu);	//判断是否有资格获奖
void SchoolExcellence(StuInfo stu[],  StuInfo temStu[]);	//获得校级优秀的
void MajorExcellence(StuInfo stu[], StuInfo temStu[], MajorInfo maj[]);	//获得专业优秀的
void MajorSort(StuInfo temStu[], MajorInfo maj[]);	//专业排序
void ExcellentStatistic(MajorInfo maj[]);	//优秀的统计
void ExcellentQuery(StuInfo stu[]);	//获奖查询分析
void Interaction(StuInfo stu[], StuInfo tem[], MajorInfo maj[]);	//人机交互界面


int allStu = 0;//学生总数
int main() 
{
	StuInfo stu[6000];	//按照文件f1的顺序存储
	StuInfo tem[6000];	//按照总分排序存储
	MajorInfo maj[51];	//存放专业信息
	Init(stu, maj);	//初始化结构体数组
	Interaction(stu, tem, maj);	//人机交互界面
	system("pause");
}

void Init(StuInfo stu[], MajorInfo maj[]) //初始化结构体数组
{
	for (int i = 0; i < 6000; i++)	//初始化学生信息数组

	{
		strcpy(stu[i].name,"");
		strcpy(stu[i].name, "");
		strcpy(stu[i].name, "");
		stu[i].t1 = 0;
		stu[i].t2 = 0;
		stu[i].t3 = 0;
		stu[i].g1 = 0;
		stu[i].g2 = 0;
		stu[i].g3 = 0;
		stu[i].z1 = 0;
		stu[i].z2 = 0;
		stu[i].State[0] = false;
		stu[i].State[1] = false;
		stu[i].averageScore = 0.0;
		stu[i].sumScore = 0.0;
		stu[i].sort = 0;
	}
	for (int i = 0; i < 51; i++)//初始化专业数组
	{
		maj[i].allNum = 0;
		maj[i].MjoExcQuota = 0;
		maj[i].notQualification = 0;
		maj[i].numMjoExc = 0;
		maj[i].numSchExc = 0;
	}
}

bool ReadF1(StuInfo stu[]) //读取显示f1
{
	int i = 0;
	FILE * fp = NULL;
	fp = fopen("f1.txt", "r");//打开f1.txt文件
	if (!fp)
	{
		return false;
	}
	else
	{
		while (fscanf(fp, "%s %s %s %d %d %d %d %d %d %d %d\n",
			stu[i].num,stu[i].name,stu[i].majorid,&stu[i].t1, &stu[i].t2, &stu[i].t3,
			&stu[i].g1, &stu[i].g2, &stu[i].g3, &stu[i].z1,&stu[i].z2) != EOF)//使用fscanf格式化读取文件
		{
			i++;
			allStu++;
		}

		
	}
	fclose(fp);
	for (size_t i = 0; i < allStu; i++)	//显示
	{
		printf("%s %s %s %d %d %d %d %d %d %d %d\n",
			stu[i].num, stu[i].name, stu[i].majorid, stu[i].t1, stu[i].t2, stu[i].t3,
			stu[i].g1, stu[i].g2, stu[i].g3, stu[i].z1, stu[i].z2);
	}
	printf("以上为所有学生信息!!!");
	system("pause");
	return true;
}

void sumSort(StuInfo stu[],StuInfo temStu[])
{
	StuInfo temp; //冒泡排序所需的临时变量
	
	for (int i = 0; i <= allStu; i++)	//每个学生总成绩计算
	{
		stu[i].averageScore = (float)(0.8*(stu[i].g1 + stu[i].g2 + stu[i].g3) + 1.2*(stu[i].z1 + stu[i].z2));	//综合评定成绩
		stu[i].sumScore = stu[i].g1 + stu[i].g2 + stu[i].g3 + stu[i].z1 + stu[i].z2 + stu[i].t1 + +stu[i].t2 + stu[i].t3;	//八门课总成绩
	}

	for (int i = 0; i < 6000; i++)	//给tempStu赋值
	{
		temStu[i] = stu[i];
	}

	//冒泡排序算法(此处题目描述不清,个人理解按照加权成绩来排序)
	for (int i = 0; i < allStu - 1; i++)
	{
		for (int j = 0; j < allStu - i - 1; j++)
		{
			if (temStu[j].averageScore < temStu[j + 1].averageScore)
			{
				temp = temStu[j];
				temStu[j] = temStu[j + 1];
				temStu[j + 1] = temp;
			}
		}
	}
	
	for (int i = 0; i < allStu; i++)	//根据排好序的学生数组计算出未排序的学生数组的各个学生的排名
	{
		for (int j = 0; j < allStu; j++)	
		{
			if (strcmp(stu[j].num,temStu[i].num) == 0)
			{
				stu[j].sort = i + 1;	//计算出排名
				temStu[i].sort = i + 1;
			}
		}
	}
}

bool IsValid(StuInfo stu) //是否具有资格获奖
{
	if ((stu.t1 < 60 || stu.t2 < 60 || stu.t3 < 60) || (stu.g1 < 70 || stu.g2 < 70 || stu.g3 < 70) || (stu.z1 < 80 || stu.z2 < 80))
	{
		return false;
	}
	else
	{
		return true;
	}
}

void SchoolExcellence(StuInfo stu[], StuInfo temStu[]) //校级优秀生成f2.txt
{
	int i = 0;
	FILE * fp;
	int numSchoolExcellent = (int)(0.05 * (float)(allStu)+0.5);//初始化校级优秀名额(全校前5%) ,+0.5为了四舍五入
	
	StuInfo temp;
	
	for (i = 0; ; i++) {//当到达总人数的5%或遍历完所有学生后退出循环
		if (IsValid(temStu[i]))
		{
			temStu[i].State[1] = true;//标记为校级优秀
		}
		if (i == numSchoolExcellent || i == allStu)//到达总人数的5%或遍历完所有学生后退出循环
		{
			break;
		}
	}

	for (int i = 0; i < allStu; i++)	//保存stu的状态
	{
		for (int j = 0; j < allStu; j++)
		{
			if (strcmp(stu[j].num, temStu[i].num) == 0)
			{
				stu[j] = temStu[i];
			}
		}
	}

	fp = fopen("f2.txt", "w+");	//写入文件
	for (int i = 0; i < allStu; i++)
	{
		if (stu[i].State[1] == true) 
		{
		fprintf(fp, "%s %s %s %d %d %d %d %d %d %d %d %.2f %d\n",
			stu[i].num, stu[i].name, stu[i].majorid, stu[i].t1,
			stu[i].t2, stu[i].t3, stu[i].g1, stu[i].g2, stu[i].g3,
			stu[i].z1, stu[i].z2, stu[i].averageScore,stu[i].sort);		
		}
	}
	fclose(fp);
	for (int i = 0; i < allStu; i++)	//显示在屏幕上
	{
		if (stu[i].State[1] == true)
		{
			printf("%s %s %s %d %d %d %d %d %d %d %d %.2f %d\n",
				stu[i].num, stu[i].name, stu[i].majorid, stu[i].t1,
				stu[i].t2, stu[i].t3, stu[i].g1, stu[i].g2, stu[i].g3,
				stu[i].z1, stu[i].z2, stu[i].averageScore, stu[i].sort);
		}
	}
	printf("以上是获得校级优秀的学生!\n");
	system("pause");
}

void MajorExcellence(StuInfo stu[], StuInfo temStu[], MajorInfo maj[])//专业优秀,生成f3.txt
{
	int i = 0;
	FILE * fp = NULL;

	for (i = 0; i < allStu; i++)//统计每个专业的总人数
	{
		maj[atoi(stu[i].majorid)].allNum++;
	}

	for (i = 0; i < 51; i++)//计算出各专业的专业优秀名额
	{
		maj[i].MjoExcQuota = (int)(0.1 * maj[i].allNum  + 0.5);//+0.5为了四舍五入
	}

	for (i = 0; i < allStu; i++)//遍历所有学生,判断是否是校级优秀
	{
		if (temStu[i].State[1] == true)
		{
			maj[atoi(temStu[i].majorid)].numSchExc++;//校级优秀人数加1
		}
	}

	for (i = 0; i < allStu; i++)//遍历所有学生,判断是否是专业优秀
	{
		if (maj[atoi(temStu[i].majorid)].numMjoExc < maj[atoi(temStu[i].majorid)].MjoExcQuota) //获奖人数不能超过规定名额(专业前10%)
		{
			if (IsValid(temStu[i]))//是否具有资格
			{
				maj[atoi(temStu[i].majorid)].numMjoExc++;//专业优秀人数加1
				temStu[i].State[0] = true;//标记为专业优秀
			}
		}
	}

	for (i = 0; i < allStu; i++)//遍历所有学生,判断是否没有资格评优
	{
		if (!IsValid(temStu[i]))//是否具有资格
		{
			maj[atoi(temStu[i].majorid)].notQualification++;//专业优秀人数加1
		}
	}

	for ( i = 0; i < allStu; i++)	//判断是否同时获得的校级和专业级
	{
		if ( (temStu[i].State[1] == true) && (temStu[i].State[0] == true) )	//如果同时获得校级和专业级
		{
			maj[atoi(temStu[i].majorid)].numMjoExc--;//专业优秀人数减1
			temStu[i].State[0] = false;//取消标记为专业优秀
		}
	}

	for (int i = 0; i < allStu; i++)	//保存stu的状态
	{
		for (int j = 0; j < allStu; j++)
		{
			if (strcmp(stu[j].num, temStu[i].num) == 0)
			{
				stu[j] = temStu[i];
			}
		}
	}

	fp = fopen("f3.txt", "w+");		//写入文件

	for ( i = 0; i < allStu; i++)
	{
		if (stu[i].State[0] == true)
		{
			fprintf(fp, "%s %s %s %d %d %d %d %d %d %d %d %.2f %d\n",
				stu[i].num, stu[i].name, stu[i].majorid, stu[i].t1,
				stu[i].t2, stu[i].t3, stu[i].g1, stu[i].g2, stu[i].g3,
				stu[i].z1, stu[i].z2, stu[i].averageScore, stu[i].sort);
		}
	}
	fclose(fp);

	for (i = 0; i < allStu; i++)		//显示在屏幕
	{
		if (stu[i].State[0] == true)
		{
			printf("%s %s %s %d %d %d %d %d %d %d %d %.2f %d\n",
				stu[i].num, stu[i].name, stu[i].majorid, stu[i].t1,
				stu[i].t2, stu[i].t3, stu[i].g1, stu[i].g2, stu[i].g3,
				stu[i].z1, stu[i].z2, stu[i].averageScore, stu[i].sort);
		}
	}
	printf("以上是获得专业优秀的学生!\n");
	system("pause");
}

void MajorSort(StuInfo temStu[], MajorInfo maj[])		//专业排序
{
	FILE * fp;
	fp = fopen("f4.txt", "w+");

	for (int i = 1; i < 51; i++)
	{
		for (int j = 0; j < allStu; j++)
		{
			if (atoi(temStu[j].majorid) == i)	//i代表第几个专业
			{		//存入文件
				if (temStu[j].State[1] == 1)	//校级优秀
				{
					fprintf(fp, "%s %s %s %d %d %d %d %d %d %d %d %.2f %d %s\n",
						temStu[j].majorid, temStu[j].num, temStu[j].name, temStu[j].t1,
						temStu[j].t2, temStu[j].t3, temStu[j].g1, temStu[j].g2, temStu[j].g3,
						temStu[j].z1, temStu[j].z2, temStu[j].averageScore, temStu[j].sort,"校级优秀");
				}
				if (temStu[j].State[0] == 1)	//专业优秀
				{
					fprintf(fp, "%s %s %s %d %d %d %d %d %d %d %d %.2f %d %s\n",
						temStu[j].majorid, temStu[j].num, temStu[j].name, temStu[j].t1,
						temStu[j].t2, temStu[j].t3, temStu[j].g1, temStu[j].g2, temStu[j].g3,
						temStu[j].z1, temStu[j].z2, temStu[j].averageScore, temStu[j].sort, "专业优秀");
				}
			}
		}
	}
	fclose(fp);

	for (int i = 1; i < 51; i++)		//显示在屏幕上
	{
		for (int j = 0; j < allStu; j++)
		{
			if (atoi(temStu[j].majorid) == i)	//从第一个专业到最后一个专业
			{
				if (temStu[j].State[1] == 1)	//校级优秀
				{
					printf("%s %s %s %d %d %d %d %d %d %d %d %.2f %d %s\n",
						temStu[j].majorid, temStu[j].num, temStu[j].name, temStu[j].t1,
						temStu[j].t2, temStu[j].t3, temStu[j].g1, temStu[j].g2, temStu[j].g3,
						temStu[j].z1, temStu[j].z2, temStu[j].averageScore, temStu[j].sort, "校级优秀");
				}
				if (temStu[j].State[0] == 1)	//专业优秀
				{
					printf("%s %s %s %d %d %d %d %d %d %d %d %.2f %d %s\n",
						temStu[j].majorid, temStu[j].num, temStu[j].name, temStu[j].t1,
						temStu[j].t2, temStu[j].t3, temStu[j].g1, temStu[j].g2, temStu[j].g3,
						temStu[j].z1, temStu[j].z2, temStu[j].averageScore, temStu[j].sort, "专业优秀");
				}
			}
		}
	}
	system("pause");
}

void ExcellentStatistic(MajorInfo maj[])		//优秀统计
{
	FILE * fp;
	float max = 0;
	int id = 0;

	fp = fopen("ExcellentStatistic.txt", "w+");//写入文件
	fprintf(fp,"%s\n","专业编号		专业总人数		校级优秀占比	专业优秀占比	无评优资格占比");
	for (int i = 1; i < 51; i++)
	{
		fprintf(fp,"%d		%d		%.2f%%		%.2f%%		%.2f%%\n",
			i,
			maj[i].allNum,
			100.0 * maj[i].numSchExc / maj[i].allNum,
			100.0*maj[i].numMjoExc / maj[i].allNum,
			100.0 * maj[i].notQualification / maj[i].allNum);
	}

	fclose(fp);

	//打印在屏幕上
	printf("专业编号	专业总人数	校级优秀占比	专业优秀占比	无评优资格占比\n");
	for (int i = 1; i < 51; i++)
	{
		printf("%d		%d		%.2f%%		%.2f%%		%.2f%%\n",
				i, 
				maj[i].allNum,
				100.0 * maj[i].numSchExc/maj[i].allNum, 
				100.0*maj[i].numMjoExc/maj[i].allNum,
				100.0 * maj[i].notQualification/maj[i].allNum);
	}

	for (int i = 1; i < 51; i++)
	{
		if (1.0*maj[i].numSchExc/maj[i].allNum > max)
		{
			max = 1.0*maj[i].numSchExc / maj[i].allNum;
			id = i;
		}
	}
	printf("\n校级优秀占比最大的专业编号是:%d\n", id);

	for (int i = 1; i < 51; i++)
	{
		if (1.0*maj[i].numMjoExc / maj[i].allNum > max)
		{
			max = 1.0*maj[i].numMjoExc / maj[i].allNum;
			id = i;
		}
	}
	printf("\n无评优资格占比最大的专业编号是:%d\n", id);
	system("pause");
}

void ExcellentQuery(StuInfo stu[])		//优秀查询
{	
	char num[6];
	char name[11];
	int i;
	FILE* fp;
	fp = fopen("ExcellentQuery.txt","a");
	printf("请输入学号,姓名:\n");
	scanf("%s", num);
	fflush(stdin);
	scanf("%s", name);

	fprintf(fp,"%s %s ",num,name);	//写入查询历史
	for ( i = 0; i < allStu; i++)	//遍历查询与之对应的学号和姓名
	{
		if ( strcmp(num,stu[i].num) == 0 && strcmp(name, stu[i].name) == 0)	//如果姓名学号匹配
		{
			if ((stu[i].State[0]==0)&&(stu[i].State[1]==0))	//如果未评上优秀
			{
				printf("\n未评上优秀!\n");
				fprintf(fp,"%s ", "未评上优秀!");
				if (stu[i].t1<60|| stu[i].t2 < 60|| stu[i].t3 < 60)
				{
					printf("\n未评上校级优秀的主要因素是:\n");
					fprintf(fp, "%s ", "未评上校级优秀的主要因素是:");
					int t[3] = { stu[i].t1,stu[i].t2 ,stu[i].t3 };
					int min = 100;
					int id = 0;
					for (int j = 0; j < 3; j++)
					{
						if (t[j] < min)
						{
							min = t[j];
							id = j;
						}
					}
					if (id == 0)
					{
						printf("\n通识教育一课程成绩不及格\n");
						fprintf(fp, "%s", "通识教育一课程成绩不及格\n");
						fclose(fp);
					}
					if (id == 1)
					{
						printf("\n通识教育二课程成绩不及格\n");
						fprintf(fp, "%s", "通识教育二课程成绩不及格\n");
						fclose(fp);
					}
					if (id == 2)
					{
						printf("\n通识教育三课程成绩不及格\n");
						fprintf(fp, "%s", "通识教育三课程成绩不及格\n");
						fclose(fp);
					}
				}
				else
				{
					if (stu[i].g1 < 70 || stu[i].g2 < 70 || stu[i].g3 < 70)	//如果公共课<70
					{
						printf("\n未评上校级优秀的主要因素是:\n");
						fprintf(fp, "%s ", "未评上校级优秀的主要因素是:");
						int t[3] = { stu[i].g1,stu[i].g2 ,stu[i].g3 };
						int min = 100;
						int id = 0;
						for (int j = 0; j < 3; j++)
						{
							if (t[j] < min)
							{
								min = t[j];
								id = j;
							}
						}
						if (id == 0)
						{
							printf("\n公共基础课一课程成绩<70\n");
							fprintf(fp, "%s", "公共基础课一课程成绩<70\n");
							fclose(fp);
						}
						if (id == 1)
						{
							printf("\n公共基础课二课程成绩<70\n");
							fprintf(fp, "%s", "公共基础课二课程成绩<70\n");
							fclose(fp);
						}
						if (id == 2)
						{
							printf("\n公共基础课三课程成绩<70\n");
							fprintf(fp, "%s", "公共基础课三课程成绩<70\n");
							fclose(fp);
						}
					}
					else
					{
						if (stu[i].z1 < 80 || stu[i].z2 < 80) //专业课<80
						{
							printf("\n未评上校级优秀的主要因素是:\n");
							fprintf(fp, "%s ", "未评上校级优秀的主要因素是:");
							if (stu[i].z1 < stu[i].z2)
							{
								printf("\n专业课一课程成绩<80\n");
								fprintf(fp, "%s", "专业课一课程成绩<80\n");
								fclose(fp);
							}
							else
							{
								printf("\n专业课二课程成绩<80\n");
								fprintf(fp, "%s", "专业课二课程成绩<80\n");
								fclose(fp);
							}
						}
						else  //综合成绩不够
						{
							printf("\n未评上校级优秀的主要因素是:\n");
							fprintf(fp, "%s ", "未评上校级优秀的主要因素是:");
							printf("\n加权成绩排名在5%%之后\n");
							fprintf(fp, "%s", "加权成绩排名在5%%之后\n");
							fclose(fp);
						}
					}
				}

			}
			else //如果评上优秀
			{
				if (stu[i].State[0]  == 1)	//如果获得专业优秀
				{
					printf("\n获得专业优秀!\n");
					fprintf(fp, "%s ", "获得专业优秀!");
					printf("\n未评上校级优秀的主要因素是:\n");
					fprintf(fp, "%s ", "未评上校级优秀的主要因素是:");
					printf("\n加权成绩排名在5%%之前\n");
					fprintf(fp, "%s", "加权成绩排名在5%%之前\n");
					fclose(fp);

				}
				if (stu[i].State[1] == 1)	//如果获得校级优秀
				{
					printf("\n获得校级优秀!\n");
					fprintf(fp, "%s", "获得校级优秀!\n");
					fclose(fp);
				}
			}
			break;
		}
	}
	if (i == allStu)
	{
		printf("查询失败!\n"); 
		fprintf(fp,"查询失败!\n","a");
		fclose(fp);
		system("pause");
		ExcellentQuery(stu);//递归调用直到输入正确
	}
	system("pause");
}

void Interaction(StuInfo stu[], StuInfo tem[], MajorInfo maj[])		//人机交互界面
{
	system("cls");
	int n;
	printf("1.读取和显示f1文件\n");
	printf("2.生成校优秀和专业优秀的评优结果\n");
	printf("3.生成分专业排序的评优结果\n");
	printf("4.评优统计功能\n");
	printf("5.评优查询与分析功能\n");
	printf("0.退出\n");
	printf("请输入要选择的功能:\n");
	scanf("%d",&n);
	switch (n)
	{
	case 1:
		ReadF1(stu);
		sumSort(stu, tem);
		Interaction(stu,tem,maj);
		break;
	case 2:
		SchoolExcellence(stu, tem);
		MajorExcellence(stu, tem, maj);
		Interaction(stu, tem, maj);
		break;
	case 3:
		MajorSort(tem, maj);
		Interaction(stu, tem, maj);
		break;
	case 4:
		ExcellentStatistic(maj);
		Interaction(stu, tem, maj);
		break;
	case 5:
		ExcellentQuery(stu);
		Interaction(stu, tem, maj);
		break;
	case 0:
		exit(0);
		break;
	default:
		Interaction(stu, tem, maj);
		break;
	}
}

你可能感兴趣的:(课设)