文章目录只记录倒数两道题目,卡了很久
- 【id:115】【20分】D. 向量4(类复合)
- 【id:116】【20分】E. 向量5(友元类)
- 总结
【id:115】【20分】D. 向量4(类复合)
题目描述
为向量1题目中实现的CVector类增加成员函数float Average(),计算n维向量的平均值并返回。
定义CStudent类,私有数据成员为:
字符串名称;姓名
CVector score;n个成绩
(1)添加构造函数,用虚参name1、n1、数组a1初始化CStudent类对象。
(2)添加输出函数,按样例格式输出CStudent对象值。
主函数输入数据,测试CStudent对象。
输入
输入多行,每行格式为:学生姓名 科目n n个成绩
输出
对每行测试数据,生成学生对象,输出如下数据:
学生姓名 n个成绩 成绩的平均值(保留2位小数)
输入样例
wangwu 5 90 80 70 100 90 lisi 3 100 90 100
输出样例
wangwu 90 80 70 100 90 86.00 lisi 100 90 100 96.67
注意事项:1、因为成员有指针所以需要用到深拷贝。2、复合类初始化最方便的方法:写个初始化成员列表。
#include#include using namespace std; class CVector { private: int* data; int n; public: CVector(); CVector(int n1, int* a); CVector(const CVector&);//拷贝构造函数声明的形参不要写具体参数,写明类型及常引用就可以了 void print(); ~CVector(); float Average(); }; CVector::CVector() { n = 5; data = new int[n]; for (int i = 0; i < 5; i++) { data[i] = i; } } CVector::CVector(int n1, int* a) { n = n1; data = new int[n]; //注意有指针的题目要用到深拷贝 for (int i = 0; i < n; i++) { data[i] = a[i]; } } CVector::CVector(const CVector& c) { n = c.n; data = new int[n]; for (int i = 0; i < n; i++) { data[i] = c.data[i]; } } void CVector::print() { for (int i = 0; i < n; i++) { cout << data[i]<<" "; } } float CVector::Average() { float sum = 0; for (int i = 0; i < n; i++) { sum += data[i]; } return sum / n; } CVector::~CVector() { if (data != NULL) { delete[]data; } } class CStudent { private: char* name; CVector score; public: CStudent(char* a,int n1,int*b); ~CStudent(); float get_average(); void print(); }; CStudent::CStudent(char* a, int n1, int* b) :score(n1, b)//初始化成员列表 { int count = 0; name = new char[30]; for (int i = 0; a[i] != ' '; i++) { name[i] = a[i]; count++; } name[count] = ' '; } CStudent::~CStudent() { delete[]name; } void CStudent::print() { cout << name << " "; score.print(); } float CStudent::get_average() { return (score.Average()); } int main() { char* a = new char[30]; while (cin>>a) { int n; cin >> n; int* v = new int[n]; for (int i = 0; i < n; i++) { cin >> v[i]; } CStudent s(a,n,v); s.print(); cout << fixed< 【id:116】【20分】E. 向量5(友元类) 题目描述
(1)在向量CVector类的代码上,定义n阶矩阵类CMatrix,包含私有数据成员data存储矩阵数据,n存储矩阵阶数。(2)将CMatrix定义为CVector的友元类。
(3)为CMatrix添加成员函数:CVector multi(const CVector &v1),计算n阶矩阵与n维向量v1的乘积。
(4)为CMatrix添加成员函数,判定矩阵与向量v1是否可计算乘积。
(5)为CMatrix添加需要的构造函数、析构函数和其它成员函数。
主函数输入数据,测试矩阵与向量的乘积。
动态创建n阶矩阵示例代码如下:
代码如下(示例):int n; int** data; int i, j; cin >> n; // 先创建n行 data = new int* [n]; // 再创建n列 for (i = 0; i < n; i++) { data[i] = new int[n]; } // 打印矩阵 for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { cin >> data[i][j]; } }
输入
测试次数t
对每组测试数据,格式如下
第一行,矩阵阶数n 向量维数m
n阶矩阵
m维向量
输出
对每组测试数据,若矩阵与向量不能计算乘积,输出error;否则输出计算结果
输入样例
1 3 1 0 0 0 1 0 0 0 1 3 1 2 3输出样例
1 2 3
注意事项:算法没多大难度,主要是注意不能返回临时对象的引用。主要算法的实现在multi函数中。
#includeusing namespace std; class CVector { private: int* data; int n; public: CVector(); CVector(int n1, int* a); CVector(const CVector& c); void print(); ~CVector(); friend class CMatrix; }; CVector::CVector(const CVector& c) { n = c.n; data = new int[n]; for (int i = 0; i < n; i++) { data[i] = c.data[i]; } } CVector::CVector() { n = 5; data = new int[n]; for (int i = 0; i < 5; i++) { data[i] = i; } } CVector::CVector(int n1, int* a) { n = n1; data = new int[n]; for (int i = 0; i < n; i++) { data[i] = a[i]; } } void CVector::print() { for (int i = 0; i < n; i++) { cout << data[i]; if (i < n - 1) { cout << " "; } } cout << endl; } CVector::~CVector() { delete data; } class CMatrix { int n; int** data; public: friend class CVector; CMatrix(); CMatrix(int n1,int**a); ~CMatrix(); int isMulti(const CVector& v1); CVector multi(const CVector& v1); }; CMatrix::CMatrix() { } int CMatrix::isMulti(const CVector& v1) { if (n != v1.n) { return 1; } else { return 0; } } CMatrix::CMatrix(int n1,int**a) { n = n1; data = new int* [n]; for (int i = 0; i < n; i++) { data[i] = new int[n]; } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { data[i][j] = a[i][j]; } } } CMatrix::~CMatrix() { delete[]data; } CVector CMatrix::multi(const CVector& v1)//切记不能返回一个临时对象的引用 { CVector temp; temp.n = v1.n; int result = 0; for (int i = 0; i < temp.n; i++) { for (int j = 0; j < v1.n; j++) { result = result + data[i][j] * v1.data[j]; } temp.data[i] = result; result = 0; } return temp; } int main() { int t; cin >> t; while (t--) { int n,m; cin >> n; int** a; int i, j; // 先创建n行 a = new int* [n]; // 再创建n列 for (i = 0; i < n; i++) { a[i] = new int[n]; } // 输入矩阵 for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { cin >> a[i][j]; } } cin >> m; int* b = new int[m]; for (int i = 0; i < m; i++) { cin >> b[i]; } CVector v(m, b); CMatrix matrix(n, a); int flag = matrix.isMulti(v); if (flag) { cout << "error" << endl; } else { CVector new_vector = matrix.multi(v); new_vector.print(); } delete[]a; delete[]b; } //system("pause"); return 0; }
总结还是一样,继续加油吧。



