一.问题描述

线性代数里面我们学习过n维向量,请用类vector_N来封装n维整型向量,成员如下;

私有数据成员:

  • 向量维数n, int型
  • 指针 p,int型

公有函数成员:

  • 无参默认构造函数,在该函数中,将n置0,将p置null;
  • 重载输入输出运算符,输入运算符,先指定向量维数,若输入为非正整数,则提示错误信息,“Error Length!”然后退出程序,若维数输入正确则分配长度为n的动态内存,并用指针p指向该内存,输出运算符依次输出向量各元素即可;
  • 重载向量的加法+、减法-、数乘*(乘数在前,乘数为int型)这三运算符;
  • 重载[]运算,例如,向量a=(1,2,3,4),a[0]的值为1,若下标越界,则输出“Error Index”,然后退出程序;
  • 返回向量维数的函数;
  • 将两个向量的内积运算定义为vector_N的友元函数;

  在主函数中定义两个vector_N类对象v1,v2,均不带参数,之后对两个对象进行输入赋值,输入数乘运算的乘数,输入待取元素的下标,对两个向量进行加、减、数乘和内积运算,并将结果输出,输出v1中对应下标对应的元素。加法、减法和内积运算先判断两向量维数是否一致,若一致则输出运算结果,否则输出错误提示信息“Mismatch Length!”

  提示:

1.此类需要用到动态内存的分配,所以在析构函数中应释放空间,并将指针置null,将维数n置0

2.需要显式定义复制构造函数vector_N(vector_N &)

3.需要重载复制运算符 vector_N operator= (vector_N &)

4.退出程序用函数 _exit(0)

5.返回值类型需要为引用的形式,另一方面,在使用时就要考虑不能返回临时变量的引用

二.设计思路

按照题目所属写出对应代码即可

三.流程图

四.伪代码 

1

五.代码实现 

#include<iostream>
using namespace std;
class vector {
private:
	int n;
	int* p;
public:

	//构造函数和析构函数
	vector():n(0),p(NULL){}
	vector(int n) : n(n) { p = new int[n]; }
	vector(vector& v) : n(v.n) { p = new int[n]; for (int i = 0; i < n; i++) p[i] = v.p[i]; }
	~vector() {delete p;  p = NULL;  n = 0; }


	//重载等于运算符
	vector& operator=(const vector& v) { 
		if (p != v.p) { delete[] p; n = v.n; p = new int[n]; for (int i = 0; i < n; i++) p[i] = v.p[i]; } 
		return *this; 
	}
	

	//重载输入输出
	friend istream& operator>>(istream& in, vector& v) {
		in >> v.n;
		if (v.n < 0) { 
			cout << "Error Length1"<<endl; 
			exit(0); 
		}
		v.p = new int[v.n];
		for (int i = 0; i < v.n; i++) in >> v.p[i];
		return in;
	}
	friend ostream& operator<<(ostream& out, vector& v) {
		out << "(";
		for (int i = 0; i < v.n; i++) {
			out << v.p[i];
			if (i < v.n - 1) out << ", ";
		}
		out << ")";
		return out;
	}


	//重载加减数乘内积
	friend vector operator+(const vector& v1, const vector& v2) {
		if (v1.n != v2.n) { cout << "Mismatch Length!" << endl; _exit(0); }
		vector res(v1.n);
		for (int i = 0; i < v1.n; i++) res.p[i] = v1.p[i] + v2.p[i];
		return res;
	}
	friend vector operator-(const vector& v1, const vector& v2) {
		if (v1.n != v2.n) { cout << "Mismatch Length!" << endl; _exit(0); }
		vector res(v1.n);
		for (int i = 0; i < v1.n; i++) res.p[i] = v1.p[i] - v2.p[i];
		return res;
	}
	friend vector operator*(const int s, const vector& v1) {
		vector res(v1.n);
		for (int i = 0; i < v1.n; i++) res.p[i] = v1.p[i] * s;
		return res;
	}
	friend int operator*(const vector v1, const vector v2) {
		if (v1.n != v2.n) { cout << "Mismatch Length!" << endl; _exit(0); }
		int res=0;
		for (int i = 0; i < v1.n; i++) res += v1.p[i] * v2.p[i];
		return res;
	}

	//重载[]运算符
	int& operator[](const int i) {
		if (i < 0 || i >= n) { cout << "Error Index" << endl; _exit(0); }
		return p[i];
	}

	void getn() {
		cout << n;
	}
	void show(int s) {
		cout << p[s];
	}
};
int main() {
	vector v1, v2, v3;
	int s, idx;
	cin >> v1 >> v2;
	cin >> s >> idx;
	v3 = v1 + v2;
	cout << v3 << endl;
	v3 = v1 - v2;
	cout << v3 << endl;
	cout << v1 * v2 << endl;
	v3 =5* v1 ;
	cout << v3 << endl;
	cout << v1[idx];
}

 

posted on 2023-04-21 22:23  leapss  阅读(16)  评论(0)    收藏  举报