Data.h

#include"Function.h"
//矩阵的数据结构载体
struct Matrix
{int m;int n;//double**指针,为其在堆区开辟内存,可以实现二维数组//由于可能涉及小数所以使用double类型double** matrix;
};
class Data
{
public://矩阵的个数int m_num;//存储矩阵的数组struct Matrix* Mat;
};

Calculator.cpp

#include"Function.h"
//矩阵的数据结构载体
struct Matrix
{int m;int n;//double**指针,为其在堆区开辟内存,可以实现二维数组//由于可能涉及小数所以使用double类型double** matrix;
};
class Data
{
public://矩阵的个数int m_num;//存储矩阵的数组struct Matrix* Mat;
};

Function.h

#pragma once;
#include<iostream>
using namespace std;
#include"Data.h"
#include<string>
#include <iomanip>//创建Function类,负责实现计算器的主要功能
class Function
{
public://构造函数Function();
public://展示功能菜单void funcShow();//退出运算器void exitCalculator();//添加矩阵void addMatrix();//显示矩阵void outMatrix();//预览全部矩阵void outWhole();//实现矩阵加法//我们希望实现连加或减功能void Add_and_Sub_Matrix();//添加一个加载功能函数,作用是将temp变量加载到m_data中void loadData(struct Matrix*temp);//添加一个函数,负责创建一个新的临时矩阵struct Matrix creatNewMatrix();struct Matrix creatNewMatrix(struct Matrix& tmp);//求矩阵的转置void getTransposition();//删除矩阵void   DeleteMatrix();//矩阵乘法void Mul_Matrix();struct Matrix operator_Mul(struct Matrix& temp, struct Matrix& tmp);struct Matrix creatNewMatrix(struct Matrix& tmp,int x);//求方阵的行列式void getDet();struct Matrix getSmallerMatrix(struct Matrix& tmp,int y);double getResult(struct Matrix& temp);//求逆void getInverseMatrix();struct Matrix getSmallerMatrix(struct Matrix& tmp, int x,int y);struct Matrix creatNewMatrix(struct Matrix& tmp, void* x);//设计矩阵元素间的左右宽度void setWide();~Function();
public:Data m_data;int wide;
};

Function.cpp

#include"Function.h"
//构造函数
Function::Function()
{m_data.m_num = 0;m_data.Mat = NULL;wide = 5;cout << "Sorry to tell you that you may fail to" << endl<< "get the inaccurate result and the format" << endl<< "may be somewhat unsatisfactory when you get the inverse matrix." << endl;
}//实现展示功能函数
void Function::funcShow()
{cout << "*************************************" << endl;cout << "欢迎使用矩阵运算器!        " << endl;cout << "0.退出                    " << endl;cout << "1.添加矩阵                " << endl;cout << "2.显示矩阵                " << endl;cout << "3.显示所有矩阵            " << endl;cout << "4.删除某个矩阵           " << endl;cout << "5.矩阵的加减运算          " << endl;cout << "6.矩阵的转置              " << endl;cout << "7.矩阵的乘法运算          " << endl;cout << "8.求方阵的行列式          " << endl;cout << "9.求方阵的逆矩阵          " << endl;cout << "10.设置矩阵元素间距        " << endl;cout << "*************************************" << endl;cout << endl;
}
//退出运算器
void Function::exitCalculator()
{cout << "退出成功!欢迎下次使用!" << endl;cout << "Be modest!!!" << endl;exit(0);
}//添加矩阵
void Function::addMatrix()
{//先用一个临时变量,这个变量在出函数体时销毁struct Matrix temp = this->creatNewMatrix();//新空间的大小为m_dam_data.m_num>0)if (this->m_data.m_num > 0){this->loadData(&temp);}else{//开辟空间m_data.Mat = new struct Matrix[m_data.m_num + 1];m_data.Mat[0] = temp;m_data.m_num++;}cout << "成功添加第" << this->m_data.m_num << "个矩阵到Data" << endl;system("pause");system("cls");
}
void Function::outMatrix()
{cout << "请输入想要查阅的矩阵序号:>>" << endl;int i;cin >> i;if (i > this->m_data.m_num||i <= 0){cout << "矩阵不存在" << endl;system("pause");system("cls");return;}cout << "显示结果如下>>" << endl;for (int j = 0; j < this->m_data.Mat[i-1].m; j++){for (int z = 0; z < this->m_data.Mat[i-1].n; z++){cout <<setw(wide)<<this->m_data.Mat[i-1].matrix[j][z] << " ";}cout << endl;}system("pause");system("cls");
}
void Function::loadData(struct Matrix*temp)
{//将temp加载到data中struct Matrix* NewSpace = new struct Matrix[m_data.m_num + 1];for (int i = 0; i < m_data.m_num; i++)NewSpace[i] = m_data.Mat[i];//释放原来的内存空间delete[]m_data.Mat;m_data.Mat = NULL;//此处曾出现BUGNewSpace[m_data.m_num] = *temp;m_data.Mat = NewSpace;m_data.m_num++;
}
void Function::outWhole()
{if (this->m_data.m_num == 0){cout << "Data中暂时没有矩阵" << endl;system("pause");system("cls");return;}cout << "全部矩阵显示如下>>" << endl;int i = 1;for (int i = 0; i < this->m_data.m_num; i++){cout << "Data中的第" << i + 1 << "个矩阵>>" << endl;for (int j = 0; j < this->m_data.Mat[i].m; j++){for (int z = 0; z < this->m_data.Mat[i].n; z++){cout <<setw(wide)<<this->m_data.Mat[i].matrix[j][z] << " ";}cout << endl;}cout << "-----------分隔符-------------" << endl;}system("pause");system("cls");
}
void Function::Add_and_Sub_Matrix()
{cout << "温馨提示:1+2= 表示data中的第一个矩阵加上第二个矩阵" << endl;cout << "请输入矩阵加减操作>>" << endl;string op;cin >> op;int i = 1;//先用一个临时变量struct Matrix temp;//加载数据,将所输入的第一个矩阵赋值给temptemp.m = this->m_data.Mat[op[i - 1] - '1'].m;temp.n = this->m_data.Mat[op[i - 1] - '1'].n;temp.matrix = new double*[temp.m];for (int i = 0; i < temp.m; i++){temp.matrix[i] = new double[temp.n];}for (int j = 0; j < temp.m; j++){for (int k = 0; k < temp.n; k++){temp.matrix[j][k] = this->m_data.Mat[op[i - 1] - '1'].matrix[j][k];}}int is_smooth = 0;while (op[i]!='='){if (this->m_data.Mat[(int)op[i + 1] - '1'].m != temp.m|| this->m_data.Mat[op[i + 1] - '1'].n != temp.n){cout << "非同型矩阵,不能进行加减法运算" << endl;is_smooth = 1;break;}else{int flag = 0;if (op[i] == '+'){flag = 1;}else{flag = -1;}for (int j = 0; j < temp.m; j++){for (int k = 0; k < temp.n; k++){temp.matrix[j][k] += flag * m_data.Mat[(int)op[i + 1] - '1'].matrix[j][k];}}}i += 2;}if (is_smooth == 0){this->loadData(&temp);cout << "运算结果作为第" << m_data.m_num << "个矩阵已经添加到Data" << endl;}system("pause");system("cls");
}
//创建矩阵
struct Matrix Function::creatNewMatrix()
{struct Matrix temp;cout << "请输入矩阵的行m和列 n:>" << endl;cin >> temp.m >> temp.n;temp.matrix = new double*[temp.m];for (int i = 0; i < temp.m; i++){temp.matrix[i] = new double[temp.n];}//添加矩阵cout << "输入矩阵的元素:>>" << endl;for (int i = 0; i<temp.m; i++){for (int j = 0; j < temp.n; j++){cin >> temp.matrix[i][j];}}return temp;
}
//删除矩阵
void Function::DeleteMatrix()
{cout << "请输入被删除矩阵的序号>>" << endl;int x;cin >> x;//两种情况if (x-1 >= this->m_data.m_num||x-1 < 0){cout << "该矩阵不存在" << endl;}else{//清楚原来堆区的数据for (int j = 0; j < this->m_data.Mat[x - 1].m; j++){delete []this->m_data.Mat[x - 1].matrix[j];}delete[]this->m_data.Mat[x - 1].matrix;for (int i = x - 1; i < this->m_data.m_num - 1; i++){this->m_data.Mat[i] = this->m_data.Mat[i+1];}//this->m_data.Mat[this->m_data.m_num - 1].matrix依旧是在栈区中开辟的//delete (this->m_data.Mat[this->m_data.m_num - 1].matrix);this->m_data.m_num--;cout << "成功删除Data中的第" << x << "个矩阵" << endl;}system("pause");system("cls");
}
void Function::getTransposition()
{/*上传一个被转置的矩阵*/cout << "请输入将被转置的矩阵序号>>" << endl;int x;cin >> x;if (x - 1 >= this->m_data.m_num || x - 1 < 0){cout << "该矩阵不存在" << endl;}else{struct Matrix temp = this->creatNewMatrix(this->m_data.Mat[x - 1]);//将结果加载到Data中this->loadData(&temp);cout << "转置结果作为" << this->m_data.m_num << "已成功添加到Data中!" << endl;}system("pause");system("cls");
}
//创建新的矩阵
struct Matrix  Function::creatNewMatrix(struct Matrix& tmp)
{struct Matrix temp;temp.m = tmp.n;temp.n = tmp.m;temp.matrix = new double*[temp.m];for (int i = 0; i < temp.m; i++){temp.matrix[i] = new double[temp.n];}for (int i = 0; i<temp.m; i++){for (int j = 0; j < temp.n; j++){temp.matrix[i][j] = tmp.matrix[j][i];}}return temp;
}
struct Matrix  Function::creatNewMatrix(struct Matrix& tmp,int x)
{struct Matrix temp;temp.m = tmp.m;temp.n = tmp.n;temp.matrix = new double*[temp.m];for (int i = 0; i < temp.m; i++){temp.matrix[i] = new double[temp.n];}for (int i = 0; i<temp.m; i++){for (int j = 0; j < temp.n; j++){temp.matrix[i][j] = tmp.matrix[i][j];}}return temp;
}
struct Matrix Function::operator_Mul(struct Matrix& temp, struct Matrix& tmp)
{struct Matrix temp1;temp1.m = temp.m;temp1.n = tmp.n;temp1.matrix = new double*[temp1.m];for (int i = 0; i < temp1.m; i++){temp1.matrix[i] = new double[temp1.n];}//初始化for (int i = 0; i < temp1.m; i++){for (int j = 0; j < temp1.n; j++){temp1.matrix[i][j] = 0;}}for (int i = 0; i < temp1.m; i++){for (int j = 0; j < temp1.n; j++){for (int k = 0; k < temp.n; k++){temp1.matrix[i][j] += temp.matrix[i][k] * tmp.matrix[k][j];}}}return temp1;
}void Function::Mul_Matrix()
{cout << "例如:1*2=表示求矩阵1乘上矩阵2" << endl;cout << "请输入运算式>>" << endl;string op;cin >> op;int i = 1;struct Matrix temp = creatNewMatrix(this->m_data.Mat[op[i - 1] - '1'],0);while (op[i] != '='){if (temp.n != this->m_data.Mat[op[i + 1] - '1'].m){cout << "矩阵不能相乘!" << endl;system("pause");system("cls");return;}temp = operator_Mul(temp, this->m_data.Mat[op[i + 1] - '1']);i += 2;}  this->loadData(&temp);cout << "乘法结果作为第" << this->m_data.m_num << "个矩阵已成功添加到Data中!" << endl;system("pause");system("cls");
}
//求取n阶行列式的值
double Function::getResult(struct Matrix& temp)
{double ret = 0.0;if (temp.m == 1){return temp.matrix[0][0];}for (int j = 0; j < temp.n; j++){//获取(0,j)元的余子式struct Matrix tmp = this->getSmallerMatrix(temp, j);if (j % 2 == 0 && temp.matrix[0][j]!=0){ret += temp.matrix[0][j] * getResult(tmp);}else if (j % 2 == 1 && temp.matrix[0][j] != 0){ret += -temp.matrix[0][j] * getResult(tmp);}elseret += 0.0;}return ret;
}
//求方阵的行列式
void Function::getDet()
{cout << "请输入方阵的编号>>" << endl;int x;cin >> x;if (x - 1 >= this->m_data.m_num || x - 1 < 0){cout << "该矩阵不存在" << endl;system("pause");system("cls");return;}if (this->m_data.Mat[x - 1].m != this->m_data.Mat[x - 1].n){cout << "该矩阵不是方阵,不能求行列式" << endl;system("pause");system("cls");return;}//获取副本struct Matrix temp = creatNewMatrix(this->m_data.Mat[x-1], 0);double ret = getResult(temp);cout << "求行列式成功" << endl;cout << "该矩阵的行列式det = " << ret << endl;system("pause");system("cls");
}
//获取余子式
struct Matrix Function::getSmallerMatrix(struct Matrix& tmp,int y)
{struct Matrix temp1;temp1.m = tmp.m - 1;temp1.n = tmp.n - 1;temp1.matrix = new double*[temp1.m];for (int i = 0; i < temp1.m; i++){temp1.matrix[i] = new double[temp1.n];}for (int i = 0; i < temp1.m; i++){for (int j = 0; j < temp1.n; j++){if (j < y){temp1.matrix[i][j] = tmp.matrix[i + 1][j];}else{temp1.matrix[i][j] = tmp.matrix[i + 1][j+1];}}}return temp1;
}
struct Matrix Function::getSmallerMatrix(struct Matrix& tmp, int x,int y)
{struct Matrix temp1;temp1.m = tmp.m - 1;temp1.n = tmp.n - 1;temp1.matrix = new double*[temp1.m];for (int i = 0; i < temp1.m; i++){temp1.matrix[i] = new double[temp1.n];}for (int i = 0; i < temp1.m; i++){for (int j = 0; j < temp1.n; j++){if (i < x&&j < y){temp1.matrix[i][j] = tmp.matrix[i][j];}else if (i < x&&j >= y){temp1.matrix[i][j] = tmp.matrix[i][j+1];}else if (i >= x&&j < y){temp1.matrix[i][j] = tmp.matrix[i+1][j];}else{temp1.matrix[i][j] = tmp.matrix[i + 1][j+1];}}}return temp1;
}
struct Matrix  Function::creatNewMatrix(struct Matrix& tmp, void* x)
{struct Matrix temp1;temp1.m = tmp.m ;temp1.n = tmp.n ;temp1.matrix = new double*[temp1.m];for (int i = 0; i < temp1.m; i++){temp1.matrix[i] = new double[temp1.n];}return temp1;
}
void Function::getInverseMatrix()
{cout << "请输入方阵的编号>>" << endl;int x;cin >> x;if (x - 1 >= this->m_data.m_num || x - 1 < 0){cout << "该矩阵不存在" << endl;system("pause");system("cls");return;}if (this->m_data.Mat[x - 1].m != this->m_data.Mat[x - 1].n){cout << "该矩阵不是方阵,不能求行列式" << endl;system("pause");system("cls");return;}struct Matrix temp = creatNewMatrix(this->m_data.Mat[x - 1], 0);double ret = getResult(temp);if (ret == 0){cout << "方阵不可逆" << endl;system("pause");system("cls");return;}if (temp.m == 1){temp.matrix[0][0] = 1 / temp.matrix[0][0];this->loadData(&temp);cout << "求逆结果作为第" << this->m_data.m_num << "个矩阵已成功添加到Data中!" << endl;system("pause");system("cls");return;}struct Matrix temp3 = creatNewMatrix(temp, NULL);for (int i = 0; i < temp.m; i++){for (int j = 0; j < temp.n; j++){//得到(i,j)元的代数余子式struct Matrix temp2 = getSmallerMatrix(temp, i, j);double ret1 = getResult(temp2);if ((i + j) % 2 == 0){temp3.matrix[j][i] = ret1 / ret;}else{temp3.matrix[j][i] = -1*ret1 / ret;}}}this->loadData(&temp3);cout << "求逆结果作为第" << this->m_data.m_num << "个矩阵已成功添加到Data中!" << endl;system("pause");system("cls");
}
void Function::setWide()
{cout << "目前矩阵元素的左右宽度为:>" << this->wide << endl;cout << "求输入修改后的宽度>>" << endl;cin >> this->wide;system("pause");system("cls");
}
Function::~Function()
{//如何释放堆区内存,由自己自己实现了cout << "如何释放堆区内存,由你自己实现了(这里偷个懒)" << endl;
}

有需求者可以在原有代码上增加你的专属功能哦!

用C++实现矩阵计算器相关推荐

  1. 汉高澳大利亚matrix矩阵计算器

    我在梦中的超级计算机超级计算机锯,使用大量阵列的cpu记忆,完成并行计算.一个手机制造商由于使用普通机械提供的服务,往往造成停机.是铁道部列车网络售票的事实. 无法使用云服务.上万台计算机并行处理,因 ...

  2. pb实现简单计算器的思想_【python实用编程之简单矩阵计算器实现】GUI编程

    以下代码是作者闲暇时所作,对GUI界面编程有想法的朋友欢迎与作者交流 以下是一个简单的矩阵计算器实现的代码: #coding=gbk from tkinter import Tk,Menu,messa ...

  3. Python列表实现矩阵的创建、输入输出、转化转置、加减乘运算并设计一个矩阵计算器GUI界面

    背景:在解决一些编程问题中如棋盘的初始化,链表,队列的构建:数据处理中如用SAS软件输入数据等涉及到矩阵的概念,而用编程语言实现矩阵的方式有C中的数组,python中的列表等.现在给你一个数据如下,或 ...

  4. 基于numpy实现矩阵计算器

    要求 制作一个Python的矩阵计算器: ① 程序提供任意两矩阵的加.乘法运算:方阵的行列式计算.逆矩阵计算.特征分解:任意矩阵的转置等计算功能,可自行添加功能 ② 从控制台通过键盘获取数据并完成以上 ...

  5. PyQt5 实现矩阵计算器

    为什么要实现矩阵计算器? 答:因为可以带来便利,相当于把matlib中对矩阵的基本操作抽离出来,降低操作门槛,同时也更加灵活自由,代码可以自己控制,功能可以自己添加修改. –参考了pyqt5的exam ...

  6. 矩阵计算器的c语言代码大全,用C语言实现矩阵计算器

    代码: //矩阵计算器 #include void getmatrix(int m, int n, double m1[][n], double m2[][m]); void calculate(in ...

  7. java联盟计算器6_GitHub - java-b/Lab-6: 矩阵计算器

    Lab-6 本节目标: 实现一个模拟 MATLAB 的矩阵计算器,可以进行矩阵的点乘和相加 矩阵计算器(Tiny Matlab) Matlab 是一个著名的数学运算工具包,在各行各业有广泛的应用.我校 ...

  8. C++实现矩阵计算器

    最近又有小伙伴找我写用C++实现一个矩阵计算器,功能如下:矩阵相加,矩阵相减,矩阵转置,矩阵相乘,行列式,和上三角,矩阵的逆. 话不多说看下文: class Matrix {private:int r ...

  9. 矩阵化为行最简形矩阵计算器_[内附完整源码和文档] 基于C++的小型特殊计算器...

    1.设计内容 实现一个特殊的计算器,可以实现复数.有理数.矩阵和集合的特殊计算.程序可以实现复数.有理数的加.减.乘.除,可以实现矩阵的加法.减法和乘法运算,也可以实现集合的求交集.并集.子集的运算. ...

最新文章

  1. 记一次前端问题解决历程(Cannot read Property ‘call‘ of undefined)
  2. NLP中文面试学习资料:面向算法面试,理论代码俱全,登上GitHub趋势榜
  3. python【数据结构与算法】最小生成树之Kruskal算法
  4. python北京理工大学推荐的书-2020最新的学Python编程的五本必读好书
  5. 处理机调度实验总结_计算机系统结构总结
  6. ECshop商城程序常见的96个小问题汇总
  7. java引用hive高可用连接hive_Hiveserver2高可用实现
  8. mysql 导入json_JsonToMysql(json导入mysql数据库工具)
  9. mysql 数据复制停止工作_linux – Mysql GTID复制停止工作
  10. 怎样判断一个网站是不是前后端分离的?
  11. 如何获取 WebAssembly 代码
  12. 李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView
  13. 韩顺平的java入门到精通中serversql笔记(包括emp表和dept表,linux的mysql版)
  14. 计算机国际标准编码,【计算机基础】常用编码格式
  15. element ui 前台模板_简单了解Vue + ElementUI后台管理模板
  16. 几句代码让Ios系统内核崩溃
  17. python二进制写入文件_python读写二进制文件的方法
  18. 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash
  19. HTML5之audio实战,网页音乐播放器开发
  20. SVM-SMO算法C++实现

热门文章

  1. FMDB與SQLite 數據庫應用示範:打做一隻簡單的電影資料庫 App
  2. Arduino (一)——面包板与固定导线长度
  3. 不等于在python中怎么打_在python中不等于用什么来表示
  4. JAVA#内部类'学习札记
  5. 【数据结构——哈夫曼树及其应用】
  6. 系统稳定神器supervisor
  7. html作品简介代码,HTML5的标签的代码的简单介绍 HTML5标签的简介
  8. Linux添加PCF8563 RTC支持
  9. JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理
  10. Django入门(一)