实验任务5
vectorInt.hpp
#pragma once #include<iostream> #include<cassert> using namespace std; class vectorInt { public: vectorInt(int n); vectorInt(int n, int value); vectorInt(const vectorInt& vi); ~vectorInt(); int& at(int index); int get_size(); friend void output(const vectorInt& vi); private: int size; int* p; }; vectorInt::vectorInt(int n) :size{ n } { cout << "constructor 1 called." << endl; p = new int[n]; } vectorInt::~vectorInt() { cout << "destructor called." << endl; delete p; } int &vectorInt::at(int index) { assert(index >= 0 && index < size); return p[index]; } vectorInt::vectorInt(const vectorInt& vi) :size{vi.size} { cout << "copy constructor called." << endl; p = new int[size]; for (auto i = 0; i < size; i++) p[i] = vi.p[i]; } vectorInt::vectorInt(int n, int value) :size{ n } { cout << "constructor 2 called." << endl; p = new int[n]; for (auto i = 0; i < n; i++) { p[i] = value; } } int vectorInt::get_size() { return size; } void output(const vectorInt& vi) { for (auto i = 0; i < vi.size; i++) cout << vi.p[i] << ", "; cout << "\b\b \n"; }
tast5.cpp
#include<iostream> #include"vectorInt.hpp" void test() { using namespace std; int n; cin >> n; vectorInt x1(n); for (auto i = 0; i < n; ++i) x1.at(i) = i * i; output(x1); vectorInt x2(n, 42); vectorInt x3(x2); output(x2); output(x3); x2.at(0) = 77; output(x2); output(x3); } int main() { test(); }
运行测试结果:
实验任务6
Matrix.hpp
#pragma once #include<iostream> using std::cout; using std::endl; class Matrix { public: Matrix(int n); // 构造函数,构造一个n*n的矩阵 Matrix(int n, int m);// 构造函数,构造一个n*m的矩阵 Matrix(const Matrix& x);// 复制构造函数,使用已有的矩阵X构造 ~Matrix();//析构函数 void set(const double* pvalue); // 用pvalue指向的连续内存块数据按行为矩阵赋值 void set(int i, int j, int value);//设置矩阵第i行第j列元素值为value double at(int i, int j)const;// 返回矩阵第i行第j列元素的值 int get_lines()const {return lines; }//返回矩阵行数 int get_cols()const { return cols; }//返回矩列数 void print() const;// 按行打印输出矩阵 private: int lines; int cols; double* p; }; Matrix::Matrix(int n) :lines{ n }, cols{ n } { //cout << "constructor 1 called." << endl; p = new double[n * n]; } Matrix::Matrix(int n, int m) :lines{ n }, cols{ m } { //cout << "constructor 2 called." << endl; p = new double[n * m]; } Matrix::Matrix(const Matrix& x) :lines{ x.lines }, cols{x.cols} { //cout << "copy constructor called." << endl; p = new double[lines * cols]; for (auto i = 0; i < lines * cols; i++) { p[i] = x.p[i]; } } Matrix::~Matrix() { //cout<< "destructor called." << endl; delete p; } void Matrix::set(const double* pvalue) { for (auto i = 0; i < lines * cols; i++) { p[i] = pvalue[i]; } } void Matrix::print()const { int k = 0; for (auto j = 0; j < lines; j++) { for (auto i = 0; i < cols; i++) { cout << p[k++] << ", "; } cout << "\b\b \n"; } } void Matrix::set(int i, int j, int value) { p[i*cols+j] = value; } double Matrix::at(int i, int j)const{ return p[i*cols+j]; }
task6.cpp
#include<iostream> #include"Matrix,hpp.h" void test() { using namespace std; double x[] = { 1,2,3,4,5,6 }; Matrix m1(3, 2); m1.set(x); m1.print(); cout << "the first line is: " << endl; cout << m1.at(0, 0) << " " << m1.at(0, 1) << endl; cout << endl; Matrix m2(2, 3); m2.set(x); m2.print(); cout << "the first line is: " << endl; cout << m2.at(0, 0) << " " << m2.at(0, 1) << " " << m2.at(0, 2) << endl; cout << endl; Matrix m3(m2); m3.set(0, 0, 999); m3.print(); cout << endl; } int main() { test(); }
运行测试结果:
改变数据:
运行测试结果:
实验总结:
实验6的空间在获取时是一维数组的的形式,需要将二维数组转化为一维数组进行存储,设置具体行列数时需要根据具体的行列进行运算,根据行序为主序,具体的地址为i*cols+j。
标签:const,Matrix,int,void,实验,数组,vectorInt,include,指针 From: https://www.cnblogs.com/zxy0324/p/16856174.html