《面向对象程序设计》作业7
作业 七
写一个程序(本题建议使用devc++),设计分数类和学生类,其中学生类中包含分数类对象,输入若干学生的数据,包括学号、姓名、成绩,要
求输出这些学生的数据并计算出学生人数和总平均成绩(要求将学生人数和总成绩用静态数据成员表示)。
输入格式
第一行给出学生个数
第二行给出姓名,学号,三门科目的分数,分别用空格隔开
输出格式
第一行输出学生姓名
第二行输出学号,三门科目成绩,分别以空格隔开
同上输出每个学生数据,最后给出总人数和总平均分数(总平均分数后无需换行)
input
0
output
Totalnumber:0
avescore:0
input
2
kevin 18064405 100 90 80
jason 21045103 80 60 90
output
kevin
18064405 100 90 80
jason
21045103 80 60 90
Totalnumber:2
avescore:83.3333
include
include
using namespace std;
class Score {
public:
double s1, s2, s3;
Score(double a = 0, double b = 0, double c = 0) : s1(a), s2(b), s3(c) {}
};
class Student {
private:
string name;
string id;
Score score;
public:
static int totalNumber;
static double totalScore;
Student() {}
void setStudent(string n, string i, double a, double b, double c) {
name = n;
id = i;
score = Score(a, b, c);
totalNumber++;
totalScore += (a + b + c);
}
void print() const {
cout << name << endl;
cout << id << " " << score.s1 << " " << score.s2 << " " << score.s3 << endl;
}
};
int Student::totalNumber = 0;
double Student::totalScore = 0;
int main() {
int n;
if (cin >> n) {
if (n > 0) {
Student* stu = new Student[n];
for (int i = 0; i < n; ++i) {
string name, id;
double a, b, c;
cin >> name >> id >> a >> b >> c;
stu[i].setStudent(name, id, a, b, c);
}
for (int i = 0; i < n; ++i) {
stu[i].print();
}
delete[] stu;
}
cout << "Totalnumber:" << Student::totalNumber << endl;
if (Student::totalNumber == 0) {
cout << "avescore:0";
} else {
cout << "avescore:" << Student::totalScore / (Student::totalNumber * 3);
}
}
return 0;
}
include
include
using namespace std;
class Score {
public:
double s1, s2, s3;
Score(double s1, double s2, double s3) : s1(s1), s2(s2), s3(s3) {}
};
class Student {
private:
static int totalNums;
static double totalScores;
string name;
string sno;
Score s;
public:
Student(string name, string sno, double a, double b, double c) : name(name), sno(sno), s(a, b, c) {
totalNums++;
totalScores += a + b + c;
}
void print() const {
cout << name << endl;
cout << sno << " " << s.s1 << " " << s.s2 << " " << s.s3 << endl;
}
// 新增:用于访问私有静态数据的公共接口
static int getTotalNums() {
return totalNums;
}
static double getTotalScores() {
return totalScores;
}
};
// 静态成员初始化
int Student::totalNums = 0;
double Student::totalScores = 0.0;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
string name, sno;
double s1, s2, s3;
cin >> name >> sno >> s1 >> s2 >> s3;
Student s(name, sno, s1, s2, s3);
s.print();
}
// 使用公共接口获取总人数
cout << "Totalnumber:" << Student::getTotalNums() << endl;
if (Student::getTotalNums() == 0) {
cout << "avescore:" << 0;
} else {
// 使用公共接口获取并计算平均分(已修正右侧的半角括号)
cout << "avescore:" << Student::getTotalScores() / (3 * Student::getTotalNums());
}
return 0;
}
定义一个集合类SET,处理整型数组。迪过成员函数重载运算付"==",判断一个数是否属与集合;(本题使用了友元,若用Vc6.0则需更改头文件)
通过友元重载运算符“==”,判断两个集合是否相同,即集合中的所有元素相同,但顺序可不同。本提只需一个简单的判断,无需
考虑数组中有相同元素的情况,具体要求如下:
(1)私有数据成员:
int *a;
//数据成员,存放整型数组,集合为数组中的所有元素
int len;
//数据成员,数组的长度
(2)公有成员函数:
SET(int *p,int n):构造函数,以形参初始化数据成员;
int operator = =(int m):重载函数,判断m是否属于当前对象所属的集合;
friend int operator = =(SET &s1,SET &s2):重载函数,判断s1和s2所属的集合是否相同,可在该函数中调用类的其他函数;
void print():输出集合;
~SET(:析构函数,释放动态内存。
输入格式
第一行给出第一个数组长度len1
第二行分别给出该数组a1的每一个成员(若数组长度为零则无需输入成员)
三四行与一二行类似
第五行给出一个整数 m
输出格式
第一行给出 m是否属于集合a1 是输出 1 否输出 0;
第二行给出 m是否属于集合a2 是输出 1 否输出 0;
第三行给出a1与a2两个集合是否相同 是输出 1 否输出零
input 1
1
1
1
1
2
output 1
0
0
1
include
using namespace std;
class SET {
private:
int *a;
int len;
public:
SET(int *p, int n);
int operator(int m);
friend int operator(SET &s1, SET &s2);
void print();
~SET();
};
SET::SET(int *p, int n) {
len = n;
if (len > 0) {
a = new int[len];
for (int i = 0; i < len; ++i) {
a[i] = p[i];
}
} else {
a = NULL;
}
}
int SET::operator==(int m) {
for (int i = 0; i < len; ++i) {
if (a[i] == m) return 1;
}
return 0;
}
int operator==(SET &s1, SET &s2) {
if (s1.len != s2.len) return 0;
for (int i = 0; i < s1.len; ++i) {
if (!(s2 == s1.a[i])) return 0;
}
return 1;
}
void SET::print() {
for (int i = 0; i < len; ++i) {
cout << a[i] << " ";
}
cout << endl;
}
SET::~SET() {
if (a != NULL) {
delete[] a;
}
}
int main() {
int len1, len2, m;
if (cin >> len1) {
int *arr1 = NULL;
if (len1 > 0) {
arr1 = new int[len1];
for (int i = 0; i < len1; ++i) {
cin >> arr1[i];
}
}
SET s1(arr1, len1);
if (arr1) delete[] arr1;
cin >> len2;
int *arr2 = NULL;
if (len2 > 0) {
arr2 = new int[len2];
for (int i = 0; i < len2; ++i) {
cin >> arr2[i];
}
}
SET s2(arr2, len2);
if (arr2) delete[] arr2;
cin >> m;
cout << (s1 == m) << endl;
cout << (s2 == m) << endl;
cout << (s1 == s2) << endl;
}
return 0;
}
定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;
(2) 定义一个圆形类Circle,其属性包括圆心和半径;
(3) 创建两个圆形对象,提示用户输入圆心坐标和半径,判断两个圆的关系,并输出结果;
关系包括相交,相离,内含,外切,内切。
(4) 观察圆形对象以及Point类成员的析构函数的调用。
输入格式
第一行给出第一个圆心的横纵坐标和半径,以空格分隔;
第二行给出第一个圆心的横纵坐标和半径,以空格分隔;
输出格式
第一行给出两圆关系五种关系分别为
“liang yuan xiang jiao”
"liang yuan nei han"
"liang yuan nei qie"
"liang yuan wai qie"
"liang yuan xiang li"
然后由析构函数进行输出
Circle::~Circle()
{
cout << "Circle destruct" << endl;
}
Point::~Point(){
cout << "Point destruct" << endl;
}
input 1
1 0 1
3 0 1
output 1
liang yuan wai qie
Circle destruct
Point destruct
Circle destruct
Point destruct
include
include
using namespace std;
class Point {
private:
double x, y;
public:
Point(double x = 0, double y = 0) : x(x), y(y) {}
~Point() {
cout << "Point destruct" << endl;
}
double distance(const Point& p) const {
return sqrt(pow(x - p.x, 2) + pow(y - p.y, 2));
}
};
class Circle {
private:
Point center;
double radius;
public:
Circle(double x, double y, double r) : center(x, y), radius(r) {}
~Circle() {
cout << "Circle destruct" << endl;
}
const Point& getCenter() const {
return center;
}
double getRadius() const {
return radius;
}
};
int main() {
double x1, y1, r1;
double x2, y2, r2;
if (cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2) {
Circle c1(x1, y1, r1);
Circle c2(x2, y2, r2);
double d = c1.getCenter().distance(c2.getCenter());
double sumR = c1.getRadius() + c2.getRadius();
double diffR = fabs(c1.getRadius() - c2.getRadius());
if (fabs(d - sumR) < 1e-6) {
cout << "liang yuan wai qie" << endl;
} else if (d > sumR) {
cout << "liang yuan xiang li" << endl;
} else if (fabs(d - diffR) < 1e-6) {
cout << "liang yuan nei qie" << endl;
} else if (d < diffR) {
cout << "liang yuan nei han" << endl;
} else {
cout << "liang yuan xiang jiao" << endl;
}
}
return 0;
}
设计有理数类CRational,数据成员由分子、分母组成(都是整型,应表示成最简形式),
完成分数显示(如用户输入的分子是4,分母是8,输出:1/2、若分数为负值,应输出-2/1而不是、
若分母为一则只输出分子。) 两个分数相加、相乘等功能。
输入格式
第一个分数的分子分母,第二个分数的分子分母,其间用空格隔开;
输出格式
第一行给出两个分数的和
第二行输出两个分数的乘,如果其中存在分母为零输出“Error!”然后换行;
input 1
4 8 6 9
output 1
7/6
1/3
include
include
using namespace std;
class CRational {
private:
long long num;
long long den;
long long gcd(long long a, long long b) {
a = abs(a);
b = abs(b);
while (b > 0) {
long long temp = a % b;
a = b;
b = temp;
}
return a;
}
void simplify() {
if (den == 0) return;
if (den < 0) {
num = -num;
den = -den;
}
if (num == 0) {
den = 1;
return;
}
long long g = gcd(num, den);
num /= g;
den /= g;
}
public:
CRational(long long n = 0, long long d = 1) : num(n), den(d) {
simplify();
}
CRational operator+(const CRational& other) const {
long long newNum = num * other.den + other.num * den;
long long newDen = den * other.den;
return CRational(newNum, newDen);
}
CRational operator*(const CRational& other) const {
long long newNum = num * other.num;
long long newDen = den * other.den;
return CRational(newNum, newDen);
}
void print() const {
if (den == 1) {
cout << num << endl;
} else {
cout << num << "/" << den << endl;
}
}
};
int main() {
long long n1, d1, n2, d2;
if (cin >> n1 >> d1 >> n2 >> d2) {
if (d1 == 0 || d2 == 0) {
cout << "Error!" << endl;
} else {
CRational r1(n1, d1);
CRational r2(n2, d2);
CRational sum = r1 + r2;
CRational product = r1 * r2;
sum.print();
product.print();
}
}
return 0;
}
浙公网安备 33010602011771号