2462: 【普及-】【P5742】评等级

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:13 解决:8

题目描述

现有 lns="http://www.w3.org/1998/Math/MathML"> 名同学,每名同学需要设计一个结构体记录以下信息:学号、学业成绩和素质拓展成绩、综合分数(实数)。每行读入同学的姓名、学业成绩和素质拓展成绩,并且计算综合分数(分别按照 lns="http://www.w3.org/1998/Math/MathML">70% 和 lns="http://www.w3.org/1998/Math/MathML">30% 权重累加),存入结构体中。还需要在结构体中定义一个成员函数,返回该结构体对象的学业成绩和素质拓展成绩的总分。

然后需要设计一个函数,其参数是一个学生结构体对象,判断该学生是否“优秀”。优秀的定义是学业和素质拓展成绩总分大于 lns="http://www.w3.org/1998/Math/MathML">140 分,且综合分数不小于 lns="http://www.w3.org/1998/Math/MathML">80 分。

当然通过本题很容易啦,本题只是为了帮助你训练结构体的使用方法。

本题存在精度误差问题,请将 a * 0.3 + b * 0.7 与 80 比较 转化为 a * 3 + b * 7 与 800 比较。

输入

第一行一个整数 lns="http://www.w3.org/1998/Math/MathML">

接下来 lns="http://www.w3.org/1998/Math/MathML"> 行,每行 lns="http://www.w3.org/1998/Math/MathML">3 个整数,依次代表学号、学业成绩和素质拓展成绩。

输出

 行,如果第 lns="http://www.w3.org/1998/Math/MathML"> 名学生是优秀的,输出 Excellent,否则输出 Not excellent

样例输入 复制

4
1223 95 59
1224 50 7
1473 32 45
1556 86 99

样例输出 复制

Excellent
Not excellent
Not excellent
Excellent

提示

数据保证,lns="http://www.w3.org/1998/Math/MathML">11000,学号为不超过 lns="http://www.w3.org/1998/Math/MathML">100000 的正整数,学业成绩和素质拓展成绩为 lns="http://www.w3.org/1998/Math/MathML">0100 之间的正整数。

分析:

在建立一个新的结构体对象时,可以在结构体中定义和结构体名称相同的构造函数(本例中结构体名称为 sudent,在结构体定义中实现名为student 的函数,不必加上函数返回类型)。在定义一个新的结构体并进行初始化时,给结构体定义一些变量,结构体对象调用构造函数,对这些变量进行处理。本例中,除了定义了一个接收3个变量的初始化构造函数,还定义了一个不接收任何变量的空的构造函数 student(){},否则直接定义结构体对象时(如 student one_student;)就会编译失败。

还可以在结构体中定义成员函数(如sum()函数),用于处理结构体对象的内部事务。构造函数是一种特殊的成员函数。在结构体内访问自己对象结构体的成员变量或者成员函数时,在对应的变量名或函数名前加 this->,但是如果不产生歧义,不加也可以。在结构体外调用结构体成员函数时只需要“结构体变量名.成员变名”即可,例如本例的one_student.sum()。

不仅如此,结构体对象还能像单个变量一样,作为参数直接传参进入函数,而不是和数组一样只能传入一个地址。这样的话在函数中修改直接传人的结构体对象中的成员变量,也不会影响到函数外面,除非加上&符号变成引用传参。代码如下:

#include <iostream>
#include <string>
#define MAXN 1024
using namespace std; 
int n, x, ans; 
struct student {
    int id;
    int academic, quality; 
    double overall;
    student(int _id, int _ac, int _qu){ //初始化构造函数
        this->id = _id;
        this->academic =_ac; 
		this->quality =_qu;
        this->overall = 0.7 * _ac + 0.3 * _qu; 
		//这里的 this-> 也可以省略
	}
    student() {} // 没有传递参数的初始化构造函数 
	int sum(){
        return academic + quality;
        // 返回值也可写为this->academic+this->quality;
    }
};
int is_excellent (student s) {
    // 访问成员变量与调用成员函数
    return s.overall >= 80 && s.sum() > 140;
    }
int main() {
    cin >> n;
    for (int i = 1; i <=n; i++){
        int tmp_id, tmp_ac, tmp_qu;
        cin >> tmp_id >> tmp_ac >> tmp_qu;
        student one_student(tmp_id, tmp_ac, tmp_qu); //结构体初始化 
        if(is_excellent (one_student)) //结构体变量作为参数传递
            cout << "Excellent" << endl; 
        else
            cout<<"Not excellent"<<endl;
    }
    return 0;
}

需要注意的是,本例题中的 one_student 这个结构体变量是在for循环里面定义的局部变量,循环结束后该变量即销毁。如果需要留存做后期处理,则需要像例 7-10一样在循环体外面定义结构体数组以留存数据。
成员函数(除了构造函数以外)在算法竞赛中使用较少,因此本例仅作为了解。结构体还有很多复杂的特性,例如公开或私有访问权限,这里不进行介绍,感兴趣的读者可以自行查阅相关资料。