2462: 【普及-】【P5742】评等级
题目描述
现有 名同学,每名同学需要设计一个结构体记录以下信息:学号、学业成绩和素质拓展成绩、综合分数(实数)。每行读入同学的姓名、学业成绩和素质拓展成绩,并且计算综合分数(分别按照 和 权重累加),存入结构体中。还需要在结构体中定义一个成员函数,返回该结构体对象的学业成绩和素质拓展成绩的总分。
然后需要设计一个函数,其参数是一个学生结构体对象,判断该学生是否“优秀”。优秀的定义是学业和素质拓展成绩总分大于 分,且综合分数不小于 分。
当然通过本题很容易啦,本题只是为了帮助你训练结构体的使用方法。
本题存在精度误差问题,请将 a * 0.3 + b * 0.7
与 80 比较 转化为 a * 3 + b * 7
与 800 比较。
输入
第一行一个整数 。
接下来 行,每行 个整数,依次代表学号、学业成绩和素质拓展成绩。
输出
Excellent
,否则输出 Not excellent
。样例输入 复制
4
1223 95 59
1224 50 7
1473 32 45
1556 86 99
样例输出 复制
Excellent
Not excellent
Not excellent
Excellent
提示
分析:
在建立一个新的结构体对象时,可以在结构体中定义和结构体名称相同的构造函数(本例中结构体名称为 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一样在循环体外面定义结构体数组以留存数据。
成员函数(除了构造函数以外)在算法竞赛中使用较少,因此本例仅作为了解。结构体还有很多复杂的特性,例如公开或私有访问权限,这里不进行介绍,感兴趣的读者可以自行查阅相关资料。