1 条题解

  • 0
    @ 2025-5-3 22:02:56

    分析:

    整体思路是对多组学生成绩数据进行处理。对于每组数据,先计算每个学生的平均成绩,再根据额外加分进行调整。接着算出所有学生平均成绩的均值和标准差,依据调整后的成绩与均值、标准差的关系为每个学生评定学分,并考虑缺勤情况对学分进行扣除。最后计算该组学生的平均学分并输出。

    解题思路:

    1.平均成绩计算:针对每个学生,先算出所有测试成绩的总和,若测试次数大于 2 次,就去掉最低分,再计算平均成绩。 成绩调整:在平均成绩的基础上加上额外加分的相应数值。

    2.统计分析:算出所有学生平均成绩的均值和标准差。 学分评定:按照调整后的成绩与均值、标准差的关系为每个学生评定初始学分,同时依据缺勤情况对学分进行扣除。若缺勤次数为 0 且调整后成绩小于均值加标准差,额外加 1 学分。

    3.结果输出:计算该组学生的平均学分并输出。

    实现步骤

    1.输入处理: 读取班级数量. 对每个班级:读取学生数量和考试次数. 对每个学生:读取考试成绩、额外加分和缺勤次数.

    2.原始平均分计算: 排序考试成绩(当考试次数 > 2 时) 计算平均分并保留一位小数

    3.班级统计计算: 计算班级所有学生的平均分总和. 计算班级平均分. 计算班级标准差.

    4.初始绩点确定: 根据调整后平均分与班级统计数据的关系确定初始绩点.

    5.绩点调整: 根据缺勤次数调整每个学生的绩点.

    6.输出结果: 计算并输出班级平均绩点(保留一位小数).

    c++代码:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    struct Student{
    	vector<int> gred;
    	int Avg, AdjAvg;
    	int bonus, absences, Grade;
    };
    int main(){
    	cout << "MAKING THE GRADE OUTPUT" << endl;
    	int Class;
    	cin >> Class;
    	while (Class --){
    		int stu, test;
    		cin >> stu >> test;
    		Student student[32];
    		for (int i = 0; i < stu; ++i){
    			int a;
    			for (int j = 0; j < test; ++j){
    				cin >> a;
    				student[i].gred.push_back(a);
    			}
    			student[i].Avg = 0;
    			if (test <= 2){
    				for (int j = 0; j < test; ++j)
    					student[i].Avg += student[i].gred[j];
    				student[i].Avg = int(((double)student[i].Avg / test)* 10);
    			}
    			else{
    				sort(student[i].gred.begin(),student[i].gred.end());
    				for (int j = 1; j < test; ++j)
    					student[i].Avg += student[i].gred[j];
    				student[i].Avg = int(((double)student[i].Avg / (test - 1))* 10);
    			}
    			cin >> student[i].bonus >> student[i].absences;
    			student[i].AdjAvg = student[i].Avg + ((student[i].bonus / 2) * 30);
    		}
    		int mean = 0, sd = 0;
    		for (int i = 0; i < stu; ++i)
    			mean += student[i].Avg;
    		mean = int((double)mean / stu);
    		for (int i = 0; i < stu; ++i)
    			sd += (student[i].Avg - mean) * (student[i].Avg - mean);
    		sd = sqrt(double(sd) / stu);
    		for (int i = 0; i < stu; ++i)
    			if (student[i].AdjAvg >= mean + sd) student[i].Grade = 4;
    			else if (student[i].AdjAvg >= mean) student[i].Grade = 3;
    			else if (student[i].AdjAvg >= mean - sd) student[i].Grade = 2;
    			else student[i].Grade = 1;
    		double avg_grd = 0;
    		for (int i = 0; i < stu; ++i){
    			if (student[i].absences == 0){
    				if(student[i].Grade < 4) student[i].Grade += 1;
    			}else{
    				student[i].Grade -= student[i].absences / 4;
    				if (student[i].Grade < 0) student[i].Grade = 0;
    			}
    			avg_grd += student[i].Grade;
    		}
    		avg_grd /= stu;
    		cout.precision(1);
    		cout << fixed << avg_grd << endl;
    	}
    	cout << "END OF OUTPUT" << endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    528
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    10
    已通过
    1
    上传者