目录
内容介绍
例题分析
内容介绍
C++不再需要用typedef的方式定义一个struct,而且在struct里除了可以有变量(成员变量)之外还可以有函数(成员函数)。
#include<iostream>
using namespace std;
struct Point{int x,y;//成员变量Point(int x=0,int y=0):x(x),y(y){}//构造函数
};
Point operator +(const Point& A,const Point& B){//重载运算符+,结构体加法return Point(A.x+B.x,A.y+B.y);
}
ostream& operator <<(ostream &out,const Point& p){//重载运算符<<out<<"("<<p.x<<","<<p.y<<")";
}
int main(){Point a,b(1,2);a.x=3;cout<<a+b<<"\n";return 0;
}
例如在上面的这个代码中,结构体Point中定义了一个函数,函数名也叫Point,但是没有返回值,这样的函数称为构造函数。构造函数是在声明变量时调用的,例如,声明Point a,b(1,2)时,分别调用了Point()和Point(1,2)。注意这个构造函数的两个参数后面都有“=0”的字样,其中0是默认值。也就是说,如果没有指明这两个参数的值,就按照0处理,因此Point()相当于Point(0,0)。"x(x),y(y)"是个简单的写法,表示把成员变量x初始化为参数x,成员变量y初始化为参数y,也可以写成:
Point(int x=0,int y=0){this->x=x;this->y=y;
}
这里的this是指向当前对象的指针,this->x的意思是“当前对象的成员变量x”,即(*this).x。接下来为这个结构体定义了加法,并且在实现中用到了构造函数。这样就可以用a+b的形式计算两个结构体a+b的“和”了。
C++中的结构体可以有1个或多个构造函数,在声明变量时调用。C++中的函数(不只是构造函数)参数可以拥有默认值。
例题分析
题目
现有N名同学,每名同学需要设计一个结构体记录以下信息:学号、学业成绩和素质拓展成绩、综合分数(实数)。每行读入同学的学号、学业成绩和素质拓展成绩,并且计算综合分数(分别按照70%和30%权重累加),存入结构体中。还需要在结构体中定义一个成员函数,返回该结构体对象的学业成绩和素质拓展成绩的总分。
然后需要设计一个函数,其参数是一个学生结构体对象,判断该学生是否“优秀”。优秀的定义是学业和素质拓展成绩总分大于140分,且综合分数不小于80分。
当然通过本题很容易啦,本题只是为了帮助你训练结构体的使用方法。
本题存在精度误差问题,请将a * 0.7 + b * 0.3
与80比较转化为a * 7 + b * 3
与800比较。
输入输出格式
输入格式
第一行一个整数N。
接下来N行,每行3个整数,依次代表学号、学业成绩和素质拓展成绩。
输出格式
N行,如果i名学生是优秀的,输出Excellent
,否则输出Not excellent
。
输入输出样例
输入样例
4
1223 95 59
1224 50 7
1473 32 45
1556 86 99
输出样例
Excellent
Not excellent
Not excellent
Excellent
代码
这个题目可以使用上面结构体的知识解决。
#include <iostream>
using namespace std;
struct Student {int id;int academic;int quality;double overall;Student() {}//没有传递参数的初始化构造函数 Student(int _id, int _academic, int _quality) {//初始化构造函数 id = _id;academic = _academic;quality = _quality;overall = 7.0 * _academic + 3.0 * _quality;}int totalScore() {return academic + quality;}bool isExcellent() {return totalScore() > 140 && overall >= 800;}
};
int main() {int N;cin >> N;Student students[N];for (int i = 0; i < N; i++) {int id, academic, quality;cin >> id >> academic >> quality;students[i] = Student(id, academic, quality);//结构体初始化 }for (int i = 0; i < N; i++) {if (students[i].isExcellent()) {cout << "Excellent" << endl;} else {cout << "Not excellent" << endl;}}return 0;
}