只记录倒数两道题目,卡了很久
题目描述
为向量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] != '\0'; i++)
{
name[i] = a[i];
count++;
}
name[count] = '\0';
}
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<<setprecision(2) << s.get_average() << endl;
delete[]v;
}
delete[]a;
//system("pause");
return 0;
}
题目描述
(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函数中。
#include
using 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;
}
还是一样,继续加油吧。