实验三 类与对象II

实验任务4 Vector类的自我实现

​ 简要说明:不使用标准库模板类vector,自己动手设计并实现一个动态的整型数组类Vector_int,并满足简单的使用需求。

​ 程序由 vector_int.hpp 与 task4.cpp 两部分构成,分别完成vector类定义及实现,主程序展示的功能。

​ vector_int.hpp代码如下:

#ifndef VECTOR_INTHPP
#define VECTOR_INTHPP
#include<iostream>
#include <cassert>
using std::cout;
using std::endl;


class Vector_int {
public:
	Vector_int(int n, int va);
	Vector_int(const Vector_int &x);
	~Vector_int();
	int at(int index);
private:
	int* ipoint;
	int size;
};

Vector_int::Vector_int(int n, int va = 0) : size(n) {
	ipoint = new int[n];
	for (int i = 0; i < size; i++)
		ipoint[i] = va;
	cout << "Calling the Constructor of Vector_int..." << endl;
}

Vector_int::Vector_int(const Vector_int& x) : size(x.size) {
	ipoint = new int[size];
	for (int i = 0; i < size; i++)
		ipoint[i] = x.ipoint[i];
	cout << "Calling the copying Constructor of Vector_int..." << endl;
}

Vector_int::~Vector_int() {
	delete[] ipoint;
	cout << "Deleting...." << endl;
}

int Vector_int::at(int index) {
	assert(index >= 0 && index < size);
	return ipoint[index];

}

#endif // !VECTOR_INTHPP

​ 主程序 task3.cpp代码如下:

#include "vector_int.hpp"
#include <iostream>
using namespace std;

int main() {
	Vector_int vi1(6);
	Vector_int vi2(8, 10);
	Vector_int vi3(vi1);

	cout << "Vector_int1[4] = " << vi1.at(4) << endl;	
	cout << "Vector_int2[7] = " << vi2.at(7) << endl;
	cout << "Vector_int1[3] = " << vi3.at(3) << endl;
}

​ 使用更改的数据的测试结果:

​ 当出现数组越界时的报错信息(assert的报错,非越界的RE):

实验任务5 Matrix类的设计与实现

​ 简要说明:实现一个动态矩阵类Matrix,并使用 task6.cpp 文件测试类的功能。

​ 程序由 Matrix.hpp 与 tas5.cpp 两部分构成,分别完成矩阵类定义及实现,主程序展示的功能。

Matrix.hpp 代码如下:

#ifndef MATRIX_H
#define MATRIX_H
#include <iostream>
using namespace std;

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);			 //返回矩阵第i行第j列元素的引用
	double at(int i, int j) const;		 // 返回矩阵第i行第j列元素的值
	int get_lines() const; 				 //返回矩阵行数
	int get_cols() const;				 //返回矩列数
	void print() const;					 // 按行打印输出矩阵
private:
	int lines;							 // 矩阵行数
	int cols;							 // 矩阵列数
	double* p;							 // 指向存放矩阵数据的内存块的首地址
};

// 类Matrix的实现:
Matrix::Matrix(int n): lines(n),cols(n) {
	p = new double[n * n];
}

Matrix::Matrix(int n, int m): lines(n), cols(m) {
	p = new double[n * m];
}

Matrix::Matrix(const Matrix& X): lines(X.lines), cols(X.cols) {
	p = new double[lines * cols];
	for (int i = 0; i < lines; i++)
		for (int j = 0; j < cols; j++)
			*(p + i * cols + j) = *(X.p + i * cols + j);
}

Matrix::~Matrix() {
	delete[] p;
}

void Matrix::set(const double* pvalue) {
	for (int i = 0; i < lines; i++) {
		for (int j = 0; j < cols; j++) {
			*(p + i * cols + j) = *(pvalue + i * cols + j);
		}
	}
}

void Matrix::set(int i, int j, int value) {
	*(p + i * cols + j) = value;
}

double& Matrix::at(int i, int j) {
	double& ret = *(p + i * cols + j);
	return ret;
}

double Matrix::at(int i, int j) const {
	return *(p + i * cols + j);
}

int Matrix::get_lines() const {
	return lines;
}

int Matrix::get_cols() const {
	return cols;
}

void Matrix::print() const {
	int i, j;
	for (i = 0; i < lines; i++) {
		for (j = 0; j < cols - 1; j++) {
			cout << *(p + i * cols + j) << ", ";
		}
		cout << *(p + i * cols + j) << endl;
	}
}

#endif

task5.cpp 代码如下:

#include <iostream>
#include "Matrix.hpp"

int main()
{
	using namespace std;
	double x[] = { 2, 3, 4, 5, 6, 7 };
	Matrix m1(3, 2);									// 创建一个3×2的矩阵
	m1.set(x);											// 用一维数组x的值按行为矩阵m1赋值
	m1.print();											// 打印矩阵m1的值
	cout << "the first line is: " << endl;
	cout << m1.at(0, 0) << " " << m1.at(0, 1) << endl;  // 输出矩阵m1第1行两个元素的值
	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);										// 用矩阵m2构造新的矩阵m3
	m3.set(0, 0, 888);									// 将矩阵m3第0行第0列元素值设为999
	m3.print();
}

使用更改的数据的测试结果:

posted @ 2021-11-05 20:28  髪之殇  阅读(52)  评论(3)    收藏  举报