目录
内容介绍
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;
}