《面向对象程序设计》作业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;
}

posted @ 2026-06-03 12:09  叶臧  阅读(12)  评论(0)    收藏  举报