学期评优方案(中国地质大学【武汉】)

题目:

已知文本文件f1.txt中存放了某校若干名大一学生的相关信息(不超过5000人),具体数据及存放格式为:每行存放一个学生的数据,数据之间用空格分隔,共有11项,依次为:学号、姓名、专业编号、通识教育课一、通识教育课二、通识教育课三、公共基础课一、公共基础课二、公共基础课三、专业主干课一、专业主干课二等8门课程的成绩。
其中,学号为5位数字字符;姓名为长度不超过10个的字符;专业编号为二位数字字符,编号从01-50(50个专业,需要50个相应的数组);所有课程成绩均为0-100的整数。
该校的学期评优政策如下: 优秀学生分为两类:校级优秀学生与专业优秀学生。 优秀学生的必备条件: 通识(t)教育课程成绩如果不及格(t <
60),公共(t)基础课成绩如果低于70分(g <70),专业(t)主干课程成绩如果低于80分(z <
80),出现这三种情况中的任何一种不能当选任何一类优秀学生。 校级优秀学生:按全校学生的5%比例评选校级优秀学生,小数部分四舍五入。
专业优秀学生:按专业学生的10%比例评选专业优秀学生,小数部分四舍五入。
综合评定成绩计算方法:通识教育课程不计算入评定成绩,仅仅作为是否具备评优的依据。公共基础课成绩的权值为0.8,专业主干课成绩的权值为1.2。计算方法:0.8三门公共基础课的总成绩+1.2二门专业主干课程的总成绩。
请编写程序,实现以下功能:
(1) 读取文件f1.txt中的数据,并将结果按照8门课的总成绩由大到小重新保存到文件s1.txt中。
(2)能够评判出满足评优条件的优秀学生的信息。根据文件f1.txt中的数据,将满足评优条件的校级优秀学生的信息保存到文件f2.txt中,将满足专业评优条件的优秀学生的信息保存到文件f3.txt中。

请编写程序:
根据文件f1.txt中的数据,生成文件f2.txt和f3.txt。文件f2.txt用以存放校级优秀学生的信息,文件f3.txt用以存放专业优秀学生的信息。文件s1.txt,f1.txt和f2.txt存放格式为:每行存放一个学生的数据,数据之间用空格分隔,共有12项,依次为:学号、姓名、专业编号、通识教育课一、通识教育课二、通识教育课三、公共基础课一、公共基础课二、公共基础课三、专业主干课二、专业主干课二等8门课程的成绩、评定总成绩。
并实现以下功能:
(1) 能够生成校级优秀学生的评优成绩。
(2) 能够生成各个专业的专业优秀学生的评优成绩。
(3) 能够统计各个专业校级优秀学生的人数。
(4) 能够统计没有校级优秀学生的专业信息。
(5) 能够统计校级优秀学生人数最多的专业信息。
(6)能够统计各专业不具备评优资格的人数。
(7) 能够统计不具备评优资格人数最多的专业信息。
(8) 能够统计各个专业优秀学生的人数。
(9)能够统计各个专业优秀学生的信息。
(10)根据学生输入的学号及姓名,查询本人的评优结果。(如果输入的学号与姓名不匹配,提示错误信息。如果只输入一项信息,禁止查询。
(11)能够分析出不具备校级优秀评选资格的各因素所占的比重以及最主要原因。

所需文件(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 

代码:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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 ;//专业课二
	bool State[2];// 0号单元true代表专业优秀 1号单元true代表校级优秀
	float averageScore ;//综合成绩
};
struct MajorInfo//专业类型结构体
{	
	int allNum ;//专业总人数
	int	MjoExcQuota ;//专业优秀人数名额
	int numSchExc ;//获得校级优秀人数
	int	numMjoExc ;//获得专业优秀人数
	int notQualification;//没有优秀人数
};
void ReadFile(StuInfo []);//读取f1.txt到stu[5000]数组
void AverageSort(StuInfo[]);//按照综合成绩从大到小排序
bool IsValue(StuInfo);//判断是否满足评优条件
void SchoolExcellence(StuInfo[]);//生成f2.txt
void MajorExcellence(StuInfo[]);//生成f3.txt
void NotRatio(StuInfo[],int [],float []);//未获校级优秀的因素比重
int Interactive();//人机交互
int case1();//生成校级优秀学生的评优成绩
int case2();//生成各个专业的专业优秀学生的评优成绩
int case3();//统计各个专业校级优秀学生的人数
int case4();//统计没有校级优秀学生的专业信息
int case5();//校级优秀学生人数最多的专业信息
int case6();//各专业不具备评优资格的人数
int case7();//不具备评优资格人数最多的专业信息
int case8();//各个专业优秀学生的人数
int case9();//各个专业优秀学生的信息
int case10();//输入的学号及姓名,查询本人的评优结果
int case11();//分析出不具备校级优秀评选资格的各因素所占的比重以及最主要原因




static int allStu = 0;//全校学生数
static int numSchoolExcellent = 0;//校级优秀学生总数
static StuInfo stu[5000];//全校学生数组
static MajorInfo maj[51];//全校专业数组,0号单元弃用
static int notNum[8] = {0,0,0,0,0,0,0,0};//未能获得校级优秀的各个科目数量
static float notRatio[8];//未能获得校级优秀的各科目所占比重
int main() 
{
	ReadFile(stu);//读取f1.txt
	AverageSort(stu);//生成s1.txt
	SchoolExcellence(stu);//生成f2.txt
	MajorExcellence(stu);//生成f3.txt
	
	int flag = 0;//程序结束标志
	while (flag == 0)//为0继续查询 为其他结束程序
	{

		flag = Interactive();//人机交互
	}
	
	system("pause");
	return 0;
}

void ReadFile(StuInfo stu[]) //读取f1.txt
{
	char str1[6], str2[11], str3[3];//定义临时变量读取文件f1.txt的数据
	int s1, s2, s3, s4, s5, s6, s7, s8;
	int i = 0;
	FILE * fp;

	fp = fopen("f1.txt", "r");//打开f1.txt文件
	while (fscanf(fp, "%s %s %s %d %d %d %d %d %d %d %d\n", str1, str2, str3, &s1, &s2, &s3, &s4, &s5, &s6, &s7, &s8)!=EOF)//使用fscanf格式化读取文件
	{
		allStu++;//统计学生总数
		strcpy(stu[i].num,str1);//为学生数组赋值
		strcpy(stu[i].name,str2);
		strcpy(stu[i].majorid,str3);
		stu[i].t1 = s1;
		stu[i].t2 = s2;
		stu[i].t3 = s3;
		stu[i].g1 = s4;
		stu[i].g2 = s5;
		stu[i].g3 = s6;
		stu[i].z1 = s7;
		stu[i].z2 = s8;
		i++;
	}
	fclose(fp);//关闭f1.txt文件
}

void AverageSort(StuInfo stu[])//生成s1.txt文件
{
	int i = 0;
	FILE * fp;
	fp = fopen("s1.txt", "w+");
	StuInfo temp; //冒泡排序所需的临时变量
	//计算平均成绩
	for (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));																		 
	}
	//冒泡排序算法
	for (i = 0; i < allStu - 1; i++)
	{
		for (int j = 0; j < allStu - i - 1; j++)
			if (stu[j].averageScore < stu[j + 1].averageScore)
			{
				temp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = temp;

			}
	}
	for (i = 0; i < allStu; i++)//将从大到小排好序的数组存入s1.txt文件
	{
		fprintf(fp, "%s %s %s %d %d %d %d %d %d %d %d %f\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);
	}
	fclose(fp);
}

bool IsValue(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[]) //校级优秀生成f2.txt
{
	FILE * fp;
	numSchoolExcellent = (int)(allStu * 0.05 + 0.5);//初始化校级优秀名额(全校前5%) ,+0.5为了四舍五入
	fp = fopen("f2.txt", "w+");
	for (int i = 0; ; i++){//综合成绩已经由高到低排序,所以不用遍历所用学生,当到达总人数的5%或遍历完所有学生后退出循环
		if (IsValue(stu[i]))
		{
			fprintf(fp, "%s %s %s %d %d %d %d %d %d %d %d %f\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].State[1] = true;//标记为校级优秀
		}
		if (i == numSchoolExcellent || i ==allStu)//到达总人数的5%或遍历完所有学生后退出循环
		{
			break;
		}
	}

	fclose(fp);
}



void MajorExcellence(StuInfo stu[])//专业优秀,生成f3.txt
{
	/*
	此部分用到atoi();函数atoi(表示 ascii to integer)把字符串转换成整型数的一个函数
	*/
	int i = 0;
	FILE * fp;
	fp = fopen("f3.txt", "w+");
	for (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;
	}
	for (i = 0; i < allStu; i++)//统计每个专业的总人数
	{
		maj[atoi(stu[i].majorid)].allNum++;
	}
	for (i = 0; i < 51; i++)//计算出各专业的专业优秀名额
	{
		maj[i].MjoExcQuota = (int)(maj[i].allNum * 0.1 + 0.5);//+0.5为了四舍五入
	}
	for (i = 0;i < allStu; i++)//遍历所有学生
	{
		if (IsValue(stu[i]))//是否具有资格
		{
			if (maj[atoi(stu[i].majorid)].numMjoExc < maj[atoi(stu[i].majorid)].MjoExcQuota) //获奖人数不能超过规定名额(专业前10%)
			{
				maj[atoi(stu[i].majorid)].numMjoExc++;//专业优秀人数加1
				stu[i].State[0] = true;//标记为专业优秀
				fprintf(fp, "%s %s %s %d %d %d %d %d %d %d %d %f\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);
			}
		}
	}
	for (i = 0; i < allStu; i++)//统计各个专业学生获奖情况
	{
		/*if (stu[i].State[0] || stu[i].State[1])
		{*/
			//if (stu[i].State[0])
			//{
			//	maj[atoi(stu[i].majorid)].numMjoExc++;//学生所在专业获得专业优秀奖人数加一
			//}
			if (stu[i].State[1])
			{
				maj[atoi(stu[i].majorid)].numSchExc++;//获得校级优秀奖人数加一
			}
		//}
	}	
	for (i = 0; i < allStu; i++)//统计各个专业没有获奖资格人数
	{
		if (!IsValue(stu[i]))//如果不具有获奖资格
		{
			maj[atoi(stu[i].majorid)].notQualification++;//没有获奖资格的人数加一
		}
	}
	fclose(fp);
}

void NotRatio(StuInfo stu[], int Num[], float Ratio[])//未获校级优秀的因素比重
{
	int i = 0;
	int allNotNum = 0;//所有没通过的因素
	for (i = 0; i < allStu; i++)
	{
		if (!stu[i].State[1])//如果没有获得校级优秀,判断其原因
		{
			if (stu[i].t1 < 60)
				notNum[0]++;
			if (stu[i].t2 < 60)
				notNum[1]++;
			if (stu[i].t3 < 60)
				notNum[2]++;
			if (stu[i].g1 < 70)
				notNum[3]++;
			if (stu[i].g2 < 70)
				notNum[4]++;
			if (stu[i].g3 < 70)
				notNum[5]++;
			if (stu[i].z1 < 80)
				notNum[6]++;
			if (stu[i].z2 < 80)
				notNum[7]++;
		}
	}
	for (i = 0; i < 8; i++)//未获校级优秀的总因素
	{
		allNotNum += notNum[i];
	}

	for (i = 0; i < 8; i++)//未获校级优秀的各个因素所占比重
	{
		Ratio[i] =(float)( notNum[i] *1.0 / allNotNum );
	}
}

int Interactive()//完成人机交互,调用相关函数
{
	int flag = 1;
	int i = -1;
	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("10.输入的学号及姓名,查询本人的评优结果\n");
	printf("11.不具备校级优秀评选资格的各因素所占的比重以及最主要原因\n");
	printf("请输入要执行的功能:\n");
	scanf("%d",&i);
	system("cls");//清屏
	switch (i)
	{
	case 1:
		flag = case1();//生成校级优秀学生的评优成绩(已经在程序启动时自动生成)
		break;
	case 2:
		flag = case2();//生成各个专业的专业优秀学生的评优成绩(已经在程序启动时自动生成)
		break;
	case 3:
		flag = case3();//统计各个专业校级优秀学生的人数
		break;
	case 4:
		flag = case4();//统计没有校级优秀学生的专业信息
		break;
	case 5:
		flag = case5();//校级优秀学生人数最多的专业信息
		break;
	case 6:
		flag = case6();//各专业不具备评优资格的人数
		break;
	case 7:
		flag = case7();//不具备评优资格人数最多的专业信息
		break;
	case 8:
		flag = case8();//各个专业优秀学生的人数
		break;
	case 9:
		flag = case9();//各个专业优秀学生的信息
		break;
	case 10:
		flag = case10();//输入的学号及姓名,查询本人的评优结果
		break;
	case 11:
		flag = case11();//不具备校级优秀评选资格的各因素所占的比重以及最主要原因
		break;
	default:
		printf("输入有误!");
		break;
	}
	system("cls");//清屏
	return flag;
}

int case1() 
{
	int flag = -1;//是否继续查询标志
	printf("已将信息生成为f2.txt\n查询其他信息请按 0\n");
	scanf("%d",&flag);
	return flag;
}
int case2()
{
	int flag = -1;//是否继续查询标志
	printf("已将信息生成为f3.txt\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case3()
{
	int flag = -1;//是否继续查询标志
	for (int i = 1; i < 51; i++)
	{
		printf("专业 %d 的校级优秀学生人数为:%d\n",i,maj[i].numSchExc);
	}
	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case4()
{
	int flag = -1;//是否继续查询标志
	for (int i = 1; i < 51; i++)
	{
		if (maj[i].numSchExc == 0)
		{
			printf(" %d 专业没有校级优秀学生!\n",i);
		}
	}
	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case5()
{
	int flag = -1;//是否继续查询标志
	int id = -1;//专业id
	MajorInfo max;
	max = maj[0];
	for (int j = 1; j < 51 ; j++)
	{
		if ( max.numSchExc < maj[j].numSchExc)
		{
			id = j;
			max = maj[j];
		}
	}
	
	
	printf(" %d 专业校级优秀人数最多,为:%d\n",id,maj[id].numSchExc);
	
	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case6()
{
	int flag = -1;//是否继续查询标志
	
	for (int i = 1; i < 51; i++)
	{
		printf(" %d 专业不具备评优资格的人数为:%d\n", i, maj[i].notQualification);
	}
	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case7()
{
	int flag = -1;//是否继续查询标志
	int id = -1;//专业id
	MajorInfo max;
	max = maj[0];
	for (int j = 1; j < 51; j++)
	{
		if (max.notQualification < maj[j].notQualification)
		{
			id = j;
			max = maj[j];
		}
	}

	printf(" %d 专业不具备评优资格人数最多,为:%d\n",id, maj[id].notQualification);

	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case8()
{
	int flag = -1;//是否继续查询标志
	
	for (int i = 1; i < 51; i++)
	{
		printf(" %d 专业校级优秀学生人数为%d,专业优秀学生人数为%d\n", i, maj[i].numSchExc,maj[i].numMjoExc);
	}
	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case9()
{
	int i = 0;
	int flag = -1;//是否继续查询标志
	int id; //专业id
	printf("请输入要查询的专业号:\n");
	scanf("%d", &id);

	printf("获得校级优秀的学生信息:\n");
	for (i = 0; i < allStu; i++)
	{
		if(stu[i].State[1] && (atoi(stu[i].majorid) == id) ) 
		{
			printf("%s %s %s %d %d %d %d %d %d %d %d %f\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);
		}
	}
	printf("获得专业优秀的学生信息:\n");
	for (i = 0; i < allStu; i++)
	{
		if (stu[i].State[0] && (atoi(stu[i].majorid) == id)) 
		{
			printf("%s %s %s %d %d %d %d %d %d %d %d %f\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);
		}
	}
	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case10()
{
	int i = 0;
	int flag = -1;//是否继续查询标志
	char num[6];
	char name[11];
	printf("请输入要查询的学号和姓名:\n");
	scanf("%s", num);
	fflush(stdin);//清除缓存
	scanf("%s", name);
	for (i = 0; i < allStu; i++)
	{
		if (strcmp(stu[i].name,name) == 0 && atoi(stu[i].num) == atoi(num) ) 
		{
			if (stu[i].State[0])
			{
				printf("该生获得专业优秀奖!\n");
			} 
			if (stu[i].State[1])
			{
				printf("该生获得学校优秀奖!\n");
			}
		}
	}
	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}
int case11() 
{
	int flag = -1;//是否继续查询标志
	int id;
	int max = notNum[0];
	NotRatio(stu,notNum,notRatio);
	printf("未获取校级优秀的主要原因占比:\n");
		printf("通识教育课一%f\n",notRatio[0]);
		printf("通识教育课二%f\n", notRatio[1]);
		printf("通识教育课三%f\n", notRatio[2]);
		printf("公共基础课一%f\n", notRatio[3]);
		printf("公共基础课二%f\n", notRatio[4]);
		printf("公共基础课三%f\n", notRatio[5]);
		printf("专业主干课一%f\n", notRatio[6]);
		printf("专业主干课二%f\n", notRatio[7]);
		
		for (int j = 0; j < 8; j++)
		{
			if (max < notNum[j])
			{
				id = j;
				max = notNum[j];
			}
		}

		switch (id)
		{
		case 0:
			printf("最主要原因是通识教育课一%f\n",notRatio[id]);
			break;
		case 1:
			printf("最主要原因是通识教育课二%f\n", notRatio[id]);
			break;
		case 2:
			printf("最主要原因是通识教育课三%f\n", notRatio[id]);
			break;
		case 3:
			printf("最主要原因是公共基础课一%f\n", notRatio[id]);
			break;
		case 4:
			printf("最主要原因是公共基础课二%f\n", notRatio[id]);
			break;
		case 5:
			printf("最主要原因是公共基础课三%f\n", notRatio[id]);
			break;
		case 6:
			printf("最主要原因是专业主干课一%f\n", notRatio[id]);
			break;
		case 7:
			printf("最主要原因是专业主干课二%f\n", notRatio[id]);
			break;
		default:
			break;
		}
	printf("\n查询其他信息请按 0\n");
	scanf("%d", &flag);
	return flag;
}




  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值