数组:

抽象数据类型:

数组的操作:

1.存值    get(index)

2.取值    set(index, value)

这两个操作定义了抽象数据类型array

c++数组的索引,且数组时c++的标准数据结构

行主映射和列主映射 :

数组的应用需要将数组的元素序列化,按照一维排列,因为数组元素一次只能输出或者输入一个。因此必须确定一个输入输出的顺序(即映射关系)。

不规则的二维数组:

当数组的每行的元素个数不相等的 时候,数组称为不规则数组。不规则数组元素的访问方式与规则数组一样;

#include <iostream>using namespace std;int main(int argc, char *argv[])
{// cout<<"Hello C-Free!"<<endl;int numberOfRows = 5;   // 数组的行数 // 定义每一行的长度int length[5] = {6, 3, 4, 2, 7};int** irregular_array = new int* [numberOfRows];   // 指向指针的指针for(int i=0; i<numberOfRows; i++){irregular_array[i] = new int[length[i]]; } // 初始化数组 for(int i=0; i<numberOfRows; i++){for(int j=0; j<length[i]; j++){irregular_array[i][j] = (i+j)*2;}}// 输出数组; for(int i=0; i<numberOfRows; i++){for(int j=0; j<length[i]; j++){cout << irregular_array[i][j] << " ";}cout << endl;} cout << "irregular_array[1][2] is " << irregular_array[1][2] << endl; return 0;
}

矩阵

即数表,同城用来组织数据.定义matrix类,将二维矩阵映射到一维数组中。

注:c++中标准异常类是定义在标准命名空间中的,所以需要using  namespace  std.

将矩阵按照行主映射存储到一维数组中,注意矩阵的索引是从1开始,数组的是从0开始,需要转换;

matrix类的定义:matrix.h文件(模板类,定义和实现放在同一个文件中)

#ifndef MATRIX_H
#define MATRIX_H
#include <iostream>
#include <stdexcept>  // 包含C++中标准异常类
#include <string>using namespace std;
// 定义matrix类
template<typename T>
class matrix
{private:int col;int row;T* element;     // 存储矩阵元素,将矩阵映射到一维数组中 //采用行主次序 public:matrix(int row=1, int col=1);   // 构造方法matrix(const matrix<T>& mat);      // copy constructor~matrix();    // 析构函数// 定义矩阵的一些操作 int rows() const;int cols() const;T& operator()(int i, int j) const;matrix<T>& operator=(const matrix<T>& mat);matrix<T> operator+();matrix<T> operator+(const matrix<T>& mat);  // 矩阵加法 matrix<T> operator-();matrix<T> operator-(const matrix<T>& mat);  // 矩阵减法 matrix<T> operator*(const matrix<T>& mat) const;   // 矩阵乘法 matrix<T> operator+=(const T num); void print_matrix() const;     // 输出矩阵
};template<typename T>
matrix<T>::matrix(int row, int col)
{// 判断矩阵的合法性if(row<=0 || col<=0){throw runtime_error("Rows and cols must > 0");} // 创建矩阵this->row = row;this->col = col;element = new T[row*col];
}template<typename T>
matrix<T>::matrix(const matrix<T>& mat)
{row = mat.rows();col = mat.cols();this->element = new T[row*col];for(int i=0; i<row*col; i++){element[i] = mat.element[i];}
}template<typename T>
matrix<T>::~matrix()
{delete [] element;
}template<typename T>
int matrix<T>::rows() const
{return row;
}template<typename T>
int matrix<T>::cols() const
{return col;
} /*
template<typename T>
T& matrix<T>::operator()(int i, int j)  //矩阵下表的最最小值是1
{int tmp = col*(i-1)+(j-1); return element[tmp];
}*/template<typename T>
matrix<T>& matrix<T>::operator=(const matrix<T>& mat)
{if(this!=&mat)   // 不能复制自己{delete [] element;   // 将原来的element删除row = mat.row;col = mat.col;element = new T [row*col];// 复制元素for(int i=0; i<(row*col); i++){element[i] = mat.element[i];} } return *this;
}// 用()表示矩阵索引
template<typename T>
T& matrix<T>::operator()(int i, int j) const
{if(i>row || i<1 || j>col || j<1){//throw invalid_argument("Matrix index out of bounds"); }return element[col*(i-1)+(j-1)];
} template<typename T>
matrix<T> matrix<T>::operator+()
{return *this;
} //定义矩阵加法
template<typename T>
matrix<T> matrix<T>::operator+(const matrix<T>& mat)
{// 先判断矩阵的维度if(col!=mat.cols() || row!=mat.rows()){//throw runtime_error("The matrix size mismatch");} matrix<T> w(row, col);   // 定义一个新的矩阵for(int i=0; i<row*col; i++){w.element[i] = element[i] + mat.element[i];} return w;
}template<typename T>
matrix<T> matrix<T>::operator-()
{matrix<T> tmp(row, col);for(int i=0; i<row*col; i++){tmp.element[i] = -element[i];}return tmp;
}// 定义矩阵减法
template<typename T>
matrix<T> matrix<T>::operator-(const matrix<T>& mat)
{if(col!=mat.cols() || row!=mat.rows()){//throw runtime_error("The matrix size mismatch");} matrix<T> w(row, col);   // 定义一个新的矩阵for(int i=0; i<row*col; i++){w.element[i] = element[i] - mat.element[i];} return w;
}template<typename T>
matrix<T> matrix<T>::operator+=(const T num)
{matrix<T> w(row, col);for(int i=0; i<row*col; i++){w.element[i] = element[i] +num;}return w;
} //定义矩阵乘法
template<typename T>
matrix<T> matrix<T>::operator*(const matrix<T>& mat) const
{// 先判断矩阵的维度if(col!=mat.rows()){throw runtime_error("Matrix size mismatch");} matrix<T> w(row, mat.col);for(int i=1; i<=row; i++){for(int j=1; j<=mat.col; j++){T sum = element[col*(i-1)+(1-1)] * mat(1, j);   // 注意这里的处理方法 。先直接计算第一项,相当于给sum赋初值,因为这里的sum不能初始化为0 for(int k=2; k<=col; k++)    // k从2开始 {sum += element[col*(i-1)+(k-1)] * mat(k, j);}w(i, j) = sum;}}return w;
}template<typename T>
void matrix<T>::print_matrix() const
{for(int i=1; i<=row; i++){for(int j=1; j<=col; j++){cout << element[col*(i-1)+(j-1)] << " ";}cout << endl;}cout << endl;
}
#endif

测试代码1;

#include <iostream>
#include "E:\back_up\code\c_plus_code\matrix\external_file\matrix.h"
//#include <stdexcept>using namespace std;int main(int argc, char *argv[])
{cout<<"Hello C-Freesdf!"<<endl;matrix<int> m1(2,2);for(int i=1; i<=2; i++){for(int j=1; j<=2; j++){m1(i,j) = i+2*j;}}matrix<int> m2;m2 = -m1; m1.print_matrix();cout << "---测试 operator-  ----" << endl;m2.print_matrix();matrix<int> m3;m3 = m2+m1;matrix<int> m4;m4 = m1-m2;cout << "---测试 operator+  ----" << endl;m3.print_matrix();cout << "---测试 operator-  ----" << endl;m4.print_matrix();matrix<int> m5;m5 = m3 += 4;cout << "---测试 operator+=  ----" << endl;m5.print_matrix();// 矩阵乘法;matrix<int> m6(2,3);for(int i=1; i<=2; i++){for(int j=1; j<=3; j++){m6(i,j)= (i-1)*3+j;}} matrix<int> m7(3,2);for(int i=1; i<=3; i++){for(int j=1; j<=2; j++){m7(i,j) = (i-1)*2+j;}}m6.print_matrix();m7.print_matrix();matrix<int> m8;try    // 添加异常捕获代码; {m8 = m6*m7;cout << "---测试 operator*  ----" << endl;m8.print_matrix();}catch(runtime_error& ex){cout << "Exception: " << ex.what() << endl;}return 0;
}

测试结果1:

测试代码2:main.cpp

#include <iostream>
#include "E:\back_up\code\c_plus_code\matrix\external_file\matrix.h"
//#include <stdexcept>using namespace std;int main(int argc, char *argv[])
{cout<<"Hello C-Freesdf!"<<endl;matrix<int> m1(2,2);for(int i=1; i<=2; i++){for(int j=1; j<=2; j++){m1(i,j) = i+2*j;}}matrix<int> m2;m2 = -m1; m1.print_matrix();cout << "---测试 operator-  ----" << endl;m2.print_matrix();matrix<int> m3;m3 = m2+m1;matrix<int> m4;m4 = m1-m2;cout << "---测试 operator+  ----" << endl;m3.print_matrix();cout << "---测试 operator-  ----" << endl;m4.print_matrix();matrix<int> m5;m5 = m3 += 4;cout << "---测试 operator+=  ----" << endl;m5.print_matrix();// 矩阵乘法;matrix<int> m6(2,3);for(int i=1; i<=2; i++){for(int j=1; j<=3; j++){m6(i,j)= (i-1)*3+j;}} matrix<int> m7(2,2);for(int i=1; i<=2; i++){for(int j=1; j<=2; j++){m7(i,j) = (i-1)*2+j;}}m6.print_matrix();m7.print_matrix();matrix<int> m8;try    // 添加异常捕获代码; {m8 = m6*m7;cout << "---测试 operator*  ----" << endl;m8.print_matrix();}catch(runtime_error& ex){cout << "Exception: " << ex.what() << endl;}return 0;
}

测试结果2:

复杂度分析

对matrix类的扩充:

1.添加tranpose()方法,实现矩阵转置

template<typename T>
matrix<T> matrix<T>::tranpose() const
{matrix<T> tmp(col, row);  // 存放转置后的矩阵for(int i=1; i<=row; i++){for(int j=1; j<=col; j++){tmp(j,i) = element[col*(i-1)+(j-1)];}} return tmp;
}

测试代码:

cout << "---测试 transpose  ----" << endl;
matrix<int> m9;
m9 = m8.tranpose();
m9.print_matrix();

结果:

2.添加自定义异常类到matrix类中:

需求:

1.当访问矩阵的索引值超过矩阵的实际大小的时候,应该抛出异常,这一功能由index_OutOf_Bound异常类实现

indexException.h文件:  基类是标准异常类out_of_range

// 自定义异常类
#ifndef INDEX_EXCEPTION_H
#define INDEX_EXCEPTION_H
#include <iostream>
#include <stdexcept>
using namespace std;
class index_OutOf_Bound: public out_of_range   // 矩阵索引超过范围
{private:int matrix_row;int matrix_col;public:index_OutOf_Bound(int row, int col):out_of_range("The matrix index out of bound")  // 自定义异常类的构造方法调用基类的构造方法{this->matrix_row = row;this->matrix_col = col;} void display_exception_info() const{cout << "Error detail" << endl;cout << "Matrix index (" << matrix_row << "," << matrix_col << ")" << " is out of bound" << endl;}
};#endif 

2.当两个矩阵做加减乘的时候,如果维度不匹配,则抛出异常,这一功能由size_mismatch_exception类实现。

sizeMismatch文件:基类是标准异常类logic_error

// 自定义异常类
#ifndef SIZE_MISMATCH_EXCEPTION
#define SIZE_MISMATCH_EXCEPTION
#include <iostream>
#include <stdexcept>
using namespace std;class size_mismatch_exception: public logic_error
{private:int a_row, a_col;int b_row, b_col;public:size_mismatch_exception(int a_row, int a_col, int b_row, int b_col): logic_error("Matrix size mismatch"){this->a_row = a_row;this->a_col = a_col;this->b_row = b_row;this->b_col = b_col;}void diaplay_error_detail() const{cout << "Error detail" << endl;cout << "A matrix size (" << a_row <<"," << a_col << ")" << " dose not match a matrix size (" << b_row << "," << b_col << ")" << endl;}
};
#endif

matrix.h文件:

#ifndef MATRIX_H
#define MATRIX_H
#include <iostream>
#include <stdexcept>  // 包含C++中标准异常类
#include <string>
#include "E:\back_up\code\c_plus_code\matrix\external_file\indexException.h"   // 异常类文件
#include "E:\back_up\code\c_plus_code\matrix\external_file\sizeMismatch.h" using namespace std;
// 定义matrix类
template<typename T>
class matrix
{private:int col;int row;T* element;     // 存储矩阵元素,将矩阵映射到一维数组中 //采用行主次序 public:matrix(int row=1, int col=1);   // 构造方法matrix(const matrix<T>& mat);      // copy constructor~matrix();    // 析构函数// 定义矩阵的一些操作 int rows() const;int cols() const;T& operator()(int i, int j) const;matrix<T>& operator=(const matrix<T>& mat);matrix<T> operator+();matrix<T> operator+(const matrix<T>& mat);  // 矩阵加法 matrix<T> operator-();matrix<T> operator-(const matrix<T>& mat);  // 矩阵减法 matrix<T> operator*(const matrix<T>& mat) const;   // 矩阵乘法 matrix<T> operator+=(const T num); matrix<T> tranpose() const;  void print_matrix() const;     // 输出矩阵
};template<typename T>
matrix<T>::matrix(int row, int col)
{// 判断矩阵的合法性if(row<=0 || col<=0){throw runtime_error("Rows and cols must > 0");} // 创建矩阵this->row = row;this->col = col;element = new T[row*col];
}template<typename T>
matrix<T>::matrix(const matrix<T>& mat)
{row = mat.rows();col = mat.cols();this->element = new T[row*col];for(int i=0; i<row*col; i++){element[i] = mat.element[i];}
}template<typename T>
matrix<T>::~matrix()
{delete [] element;
}template<typename T>
int matrix<T>::rows() const
{return row;
}template<typename T>
int matrix<T>::cols() const
{return col;
} /*
template<typename T>
T& matrix<T>::operator()(int i, int j)  //矩阵下表的最最小值是1
{int tmp = col*(i-1)+(j-1); return element[tmp];
}*/template<typename T>
matrix<T>& matrix<T>::operator=(const matrix<T>& mat)
{if(this!=&mat)   // 不能复制自己{delete [] element;   // 将原来的element删除row = mat.row;col = mat.col;element = new T [row*col];// 复制元素for(int i=0; i<(row*col); i++){element[i] = mat.element[i];} } return *this;
}// 用()表示矩阵索引
template<typename T>
T& matrix<T>::operator()(int i, int j) const
{if(i>row || i<1 || j>col || j<1){//throw invalid_argument("Matrix index out of bounds"); throw index_OutOf_Bound(i, j);}return element[col*(i-1)+(j-1)];
} template<typename T>
matrix<T> matrix<T>::operator+()
{return *this;
} //定义矩阵加法
template<typename T>
matrix<T> matrix<T>::operator+(const matrix<T>& mat)
{// 先判断矩阵的维度if(col!=mat.cols() || row!=mat.rows()){//throw runtime_error("The matrix size mismatch");throw size_mismatch_exception(row, col, mat.row, mat.col);   // 矩阵维度不匹配 } matrix<T> w(row, col);   // 定义一个新的矩阵for(int i=0; i<row*col; i++){w.element[i] = element[i] + mat.element[i];} return w;
}template<typename T>
matrix<T> matrix<T>::operator-()
{matrix<T> tmp(row, col);for(int i=0; i<row*col; i++){tmp.element[i] = -element[i];}return tmp;
}// 定义矩阵减法
template<typename T>
matrix<T> matrix<T>::operator-(const matrix<T>& mat)
{if(col!=mat.cols() || row!=mat.rows()){//throw runtime_error("The matrix size mismatch");throw size_mismatch_exception(row, col, mat.row, mat.col);   // 矩阵维度不匹配} matrix<T> w(row, col);   // 定义一个新的矩阵for(int i=0; i<row*col; i++){w.element[i] = element[i] - mat.element[i];} return w;
}template<typename T>
matrix<T> matrix<T>::operator+=(const T num)
{matrix<T> w(row, col);for(int i=0; i<row*col; i++){w.element[i] = element[i] +num;}return w;
} //定义矩阵乘法
template<typename T>
matrix<T> matrix<T>::operator*(const matrix<T>& mat) const
{// 先判断矩阵的维度if(col!=mat.rows()){// throw runtime_error("Matrix size mismatch");throw size_mismatch_exception(row, col, mat.row, mat.col);} matrix<T> w(row, mat.col);for(int i=1; i<=row; i++){for(int j=1; j<=mat.col; j++){T sum = element[col*(i-1)+(1-1)] * mat(1, j);   // 注意这里的处理方法 。先直接计算第一项,相当于给sum赋初值,因为这里的sum不能初始化为0 for(int k=2; k<=col; k++)    // k从2开始 {sum += element[col*(i-1)+(k-1)] * mat(k, j);}w(i, j) = sum;}}return w;
}template<typename T>
void matrix<T>::print_matrix() const
{for(int i=1; i<=row; i++){for(int j=1; j<=col; j++){cout << element[col*(i-1)+(j-1)] << " ";}cout << endl;}cout << endl;
} template<typename T>
matrix<T> matrix<T>::tranpose() const
{matrix<T> tmp(col, row);  // 存放转置后的矩阵for(int i=1; i<=row; i++){for(int j=1; j<=col; j++){tmp(j,i) = element[col*(i-1)+(j-1)];}} return tmp;
}
#endif

测试函数:

main.cpp

#include <iostream>
#include "E:\back_up\code\c_plus_code\matrix\external_file\matrix.h"
//#include <stdexcept>using namespace std;int main(int argc, char *argv[])
{// 矩阵乘法;matrix<int> m6(2,3);for(int i=1; i<=2; i++){for(int j=1; j<=3; j++){m6(i,j)= (i-1)*3+j;}} matrix<int> m7(2,2);for(int i=1; i<=2; i++){for(int j=1; j<=2; j++){m7(i,j) = (i-1)*2+j;}}m6.print_matrix();m7.print_matrix();matrix<int> m8;try    // 添加异常捕获代码; {m8 = m6*m7;cout << "---测试 operator*  ----" << endl;m8.print_matrix();cout << "---测试 transpose  ----" << endl;matrix<int> m9;m9 = m8.tranpose();m9.print_matrix();}catch(size_mismatch_exception& ex){cout << "Exception: " << ex.what() << endl;ex.diaplay_error_detail();}/*********测试indexException*************/matrix<int> m1(2,3);for(int i=1; i<=2; i++){for(int j=1; j<=3; j++){m1(i,j)= (i-1)*3+j;}} m1.print_matrix();try{int a = m1(1,2);int b = m1(2,4);cout << "result is " << (a+b) << endl; }catch(index_OutOf_Bound& ex){cout << ex.what() << endl;ex.display_exception_info();}return 0;}

测试结果:

------------------------------------------------------分割线----------------------------------------------------------

数据结构预算法(六) 数组和矩阵(1)相关推荐

  1. 数据结构实验之数组一:矩阵转置

    数据结构实验之数组一:矩阵转置 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 数组- ...

  2. 数据结构5.1二维数组与矩阵乘法

    二维数组的定义可以采用静态和动态两种,静态数组是在定义的时候就知道了整个二维所需要的空间.在实际应用中大多利用动态数组,灵活度高,不用提前知道矩阵的大小,但在有些情况下,静态数组会更加方便直白.矩阵相 ...

  3. 数组:矩阵快速转置 矩阵相加 三元组顺序表/三元矩阵 随机生成稀疏矩阵 压缩矩阵【C语言,数据结构】(内含源代码)

    目录 题目: 题目分析: 概要设计: 二维矩阵数据结构: 三元数组\三元顺序表顺序表结构: 详细设计: 三元矩阵相加: 三元矩阵快速转置: 调试分析: 用户手册: 测试结果: 源代码: 主程序: 头文 ...

  4. 天勤2022数据结构(六)图

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 天勤2022数据结构(六)图 前言 一.基础算法 例题 Prim算法 Kruskal算法 Dijkstra算法 Floyd算法 拓扑排 ...

  5. 数据结构第六章——图

    数据结构第六章--图 图的定义和术语 G = (V, E) V:顶点(数据元素的)有穷非空集合: E:边的有穷集合. 无向图:每条边都是无方向的. 有向图:每条边都是有方向的. 完全图:任意两个顶点都 ...

  6. python数组和矩阵用法

    python数组和矩阵 先创建一个一维数组 直接定义一个数组: a = [1,2,3,4,5] b = ['a','c','c','s'] print(a) print(b) 输出结果: 通过键盘输入 ...

  7. SDUT 3347 数据结构实验之数组三:快速转置

    数据结构实验之数组三:快速转置 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 转置运算是一种最简单的矩阵运算,对于一个 ...

  8. 数据结构与算法--数组:二维数组中查找

    数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存.即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存, ...

  9. Python 数据分析三剑客之 NumPy(六):矩阵 / 线性代数库与 IO 操作

    CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...

  10. 数据结构考点之n阶矩阵

    n阶对称矩阵表示 如题:2021年10月 分析 解决 扩展 三角矩阵 上三角矩阵的压缩存储 涉及到的数学公式.总结 稀疏矩阵 如题:2021年10月 分析 n阶,可以理解为台阶,而不是阶乘,第一行需要 ...

最新文章

  1. 1、时间、FHS 学习笔记
  2. ckeditor上传图片文件,研究了一天,终于...
  3. 一个Java递归删除目录的方法
  4. golang类型断言及检测其是否断言成功
  5. MongoDB 常用故障排查工具
  6. 总结css中单位px和em,rem的区别
  7. layui 如何去dom_常用元素操作 - layui.element
  8. Dais-CMX系列现代计算机组成原理,01 十六位机运算器实验
  9. Android系统(221)---O版自定义开关机动画
  10. GridView 高级技术
  11. 第1本书:CCIE Practical Studies, Volume I-第13天
  12. rails用generate为两个模型创建has_and_belongs_to_many中间表
  13. 设置窗体的可见性无效
  14. 数学趣题——猴子吃桃问题
  15. 周鸿祎评互联网大佬的编程能力:我能排前三,谁排第一?
  16. C语言 谭浩强第五版 课后习题解答
  17. MCGS触摸屏通过MODBUS通讯速度控制台达B2伺服参数
  18. Windows C编程中Win7隐藏任务栏图标方法
  19. 贪玩蓝月角色服务器找不到了,贪玩蓝月合服角色处理方法曝光
  20. 如何用Python进行数据分析

热门文章

  1. nginx学习笔记003---Nginx代理配置_注意,在Windows中路径要用/
  2. MySQL 在控制台插入数据时,中文乱码问题的解决
  3. Android学习笔记---28_网络通信之通过HTTP协议实现文件上传,组拼http 的post方法,传输内容
  4. 图片资源加载路径分析以及netbeans打包java程序,并包含图片资源
  5. bilibili源码_bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋
  6. php 子文件夹如何定义,php-子文件夹的重写规则
  7. 基于51单片机的时钟系统
  8. mysql 5.7.11 x64_mysql 5.7.11 winx64安装配置教程
  9. exe电子书转换txt 下载_如何把电子书转换成适合Kindle 的格式?这是最全的攻略...
  10. 融云服务器实时消息路由,IM 北极星产品功能介绍