C++解题 - 算绩点&排名

C++解题 - 算绩点&排名


时间限制: 1 Sec 内存限制: 128 MB

问题

问题描述
李华大学已经上过一个学期了,也了解了大学的考试,在没出成绩之前,他还是很担心的,在成绩出来后心里的那块石头终于落下了。但在成绩单上他看到了一些高中没见到的名词,成绩单上有每科的学分,自己获得学分,还有平均学分绩点。然后他问问了学长,学长告诉他成绩排名是按平均学分绩点来排的,并告诉他了平均学分绩点是如何算的,假设他的考试科门有高数,英语,导论,这3门的学分分别是5,4,4;学分绩点的计算:不及格的学分绩点为:0,及格的学分绩点为:学分*(成绩-50)*0.1;平均学分绩点的计算:总科目学分绩点相加除以总科目学分相加(结果保留两位小数)。
假设李华这3门的成绩分别为:97,85,87;取得的学分绩点分别为:23.5,14,14.8;平均学分绩点为:4.02。
他现在知道了室友的成绩但不知道平均学分绩点,他在第一学期学了程序,现在想用程序来计算并对一个寝室的人进行排名,大家来帮帮他。(按平均学分绩点从大到小的顺序排,平均学分绩点相同的,依次按照高数,英语,导论的顺序来排,都相等的按姓名的字典序排)
输入格式
第一行为一个整数n代表寝室的人数
每个学生的成绩占4行
一行包括姓名,
另三行是3科的科目名和成绩中间用空格隔开
输出格式
输出有n行,每行为一个学生的信息,学生信息按姓名 平均学分绩点 高数学分绩点 英语学分绩点 导论学分绩点 (中间用空格隔开,保留两位小数)
样例输入

3
LiHua
Math 97
English 85
Theory 87
Easter
Math 90
English 80
Theory 85
Aidan
Math 97
English 87
Theory 85

样例输出

Aidan 4.02 23.50 14.80 14.00
LiHua 4.02 23.50 14.00 14.80
Easter 3.54 20.00 12.00 14.00

题意
统计学生姓名和三科成绩,根据学分和成绩计算各个学生的绩点并排名
思路
可以使用三个函数来实现三种指令功能的调用,使用string []字符串数组来储存文件的名字和路径名字。

代码

#include <iostream>//头文件
#include <cstdio>//包含printf函数
using namespace std;
//定义储存室友数据的结构体
struct roomate
{
    string Name,Sub[3];//姓名和三门学科,都是字符串变量
    double Scord[3],Spoint[4];//三门学科的成绩和平均绩点+三门学课的绩点
}Human[10];//使用结构体数组储存多个人的信息
//主函数
int main()
{
    int pn,i,j,sx[10],t;//pn - 人数;i、j - 循环变量;sx[] - 每个人的序号;t - 交换序号所需的中间变量;
    for (i=0;i<10;i++) sx[i] = i;//将储存序号的数组初始化
    cin >> pn;//输入人数
    for (i=0;i<pn;i++)
    {
    	//以下四行输入每个人的基本信息
        cin >> Human[i].Name;
        cin >> Human[i].Sub[0] >> Human[i].Scord[0];
        cin >> Human[i].Sub[1] >> Human[i].Scord[1];
        cin >> Human[i].Sub[2] >> Human[i].Scord[2];
        //将三科成绩对应的绩点对应储存(高数 - 1;英语 - 2;导论 - 3;)并计算平均学分绩点(0)
        for (j=0;j<3;j++)
        {
            if (Human[i].Sub[j][0]=='M')
                if (Human[i].Scord[j]<60) Human[i].Spoint[1] = 0;
                else Human[i].Spoint[1] = 5*(Human[i].Scord[j]-50)*0.1;
            else if (Human[i].Sub[j][0]=='E')
                if (Human[i].Scord[j]<60) Human[i].Spoint[2] = 0;
                else Human[i].Spoint[2] = 4*(Human[i].Scord[j]-50)*0.1;
            else if (Human[i].Sub[j][0]=='T')
                if (Human[i].Scord[j]<60) Human[i].Spoint[3] = 0;
                else Human[i].Spoint[3] = 4*(Human[i].Scord[j]-50)*0.1;
        }
        Human[i].Spoint[0] = (Human[i].Spoint[1]+Human[i].Spoint[2]+Human[i].Spoint[3])/(5+4+4);
    }
    //使用冒泡排序的结构,对所有人进行排序
    //依照1.平均学分绩点2.高数学分绩点3.英语学分绩点4.导论学分绩点5.姓名词典序
    for (i=0;i<pn-1;i++)
        for (j=0;j<pn-1-i;j++)
            if (Human[sx[j]].Spoint[0]<Human[sx[j+1]].Spoint[0])//1.平均学分绩点
            {
                t = sx[j];
                sx[j] = sx[j+1];
                sx[j+1] = t;
            }
            else if (Human[sx[j]].Spoint[0]==Human[sx[j+1]].Spoint[0])
            {
                if (Human[sx[j]].Spoint[1]<Human[sx[j+1]].Spoint[1])//2.高数学分绩点
                {
                    t = sx[j];
                    sx[j] = sx[j+1];
                    sx[j+1] = t;
                }
                else if (Human[sx[j]].Spoint[1]==Human[sx[j+1]].Spoint[1])
                {
                    if (Human[sx[j]].Spoint[2]<Human[sx[j+1]].Spoint[2])//3.英语学分绩点
                    {
                        t = sx[j];
                        sx[j] = sx[j+1];
                        sx[j+1] = t;
                    }
                    else if (Human[sx[j]].Spoint[2]==Human[sx[j+1]].Spoint[2])
                    {
                        if (Human[sx[j]].Spoint[3]<Human[sx[j+1]].Spoint[3])//4.导论学分绩点
                        {
                            t = sx[j];
                            sx[j] = sx[j+1];
                            sx[j+1] = t;
                        }
                        else if (Human[sx[j]].Spoint[3]==Human[sx[j+1]].Spoint[3])
                        {
                            if (Human[j].Name[0]>Human[j+1].Name[0])//5.姓名词典序【暴力排序【排了五个字母
                            {
                                t = sx[j];
                                sx[j] = sx[j+1];
                                sx[j+1] = t;
                            }
                            else if (Human[j].Name[0]==Human[j+1].Name[0])
                            {
                                if (Human[j].Name[1]>Human[j+1].Name[1])
                                {
                                    t = sx[j];
                                    sx[j] = sx[j+1];
                                    sx[j+1] = t;
                                }
                                else if (Human[j].Name[1]==Human[j+1].Name[1])
                                {
                                    if (Human[j].Name[2]>Human[j+1].Name[2])
                                    {
                                        t = sx[j];
                                        sx[j] = sx[j+1];
                                        sx[j+1] = t;
                                    }
                                    else if (Human[j].Name[2]==Human[j+1].Name[2])
                                    {
                                        if (Human[j].Name[3]>Human[j+1].Name[3])
                                        {
                                            t = sx[j];
                                            sx[j] = sx[j+1];
                                            sx[j+1] = t;
                                        }
                                        else if (Human[j].Name[3]==Human[j+1].Name[3])
                                        {
                                            if (Human[j].Name[4]>Human[j+1].Name[4])
                                            {
                                                t = sx[j];
                                                sx[j] = sx[j+1];
                                                sx[j+1] = t;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
    for (i=0;i<pn;i++)//最后按顺序输出排好的数据
    {
        cout << Human[sx[i]].Name;
        for (j=0;j<4;j++) printf(" %.2lf",Human[sx[i]].Spoint[j]);
        cout << endl;
    }
    return 0;
}

运行结果
在这里插入图片描述

总结:

本题的难点是结构体的运用以及复杂的数据和条件,理清思路就很简单辣~

发布了17 篇原创文章 · 获赞 22 · 访问量 4481

猜你喜欢

转载自blog.csdn.net/qq_37504214/article/details/86746282