網(wǎng)站首頁 編程語言 正文
前言
博主本人為C++菜鳥一只,本篇博客也是第一次寫,主要目的用于自己mark,如有錯(cuò)誤歡迎指出
本博客代碼為我做C++實(shí)驗(yàn)時(shí)的代碼,由于自己是菜鳥,所以代碼內(nèi)容掌握的也不是很熟。
在此記下此篇,待到日后查看也是屬于自己青春的一部分吧。
正文
整個(gè)工程分為頭文件,source,以及main構(gòu)成。
工程的目的為實(shí)現(xiàn)對(duì)矩陣運(yùn)算符‘+’,‘-’,‘*’,‘==’,‘!=’,‘<<’和‘>>’的重載,并在main中測試其情況。
以下為頭文件
//Matrix.h
#ifndef MATRIX_H
#define MATRIX_H
#include <iostream>
using namespace std;
class Matrix
{
public:
Matrix operator + (Matrix&a);//重載 +
Matrix operator - (Matrix&b);//重載 -
Matrix operator * (Matrix&c);//重載 *
bool operator == (Matrix&d);//重載 ==
bool operator != (Matrix&e);//重載 !=
friend ostream& operator << (ostream&,Matrix&);//重載 <<
friend istream& operator>>(istream&,Matrix&);//重載 >>
void setMatrix(int a, int b);//設(shè)置矩陣行列
private:
int row;
int col;
int matrix[200][200];
};
#endif
關(guān)于 void setMatrix(int a, int b); 其實(shí)這個(gè)函數(shù)可以不設(shè)置,利用構(gòu)造函數(shù)可以完成該功能,甚至更完美。但我有些小懶,就不想去修改了,如果出事的話…QAQ還是希望不會(huì)出事吧。
還有就是,矩陣我設(shè)置成了200*200,其實(shí)可以利用new調(diào)用動(dòng)態(tài)內(nèi)存來更好的實(shí)現(xiàn),但由于我太菜,不想去用二重指針,故放棄了這個(gè)方案。
以下為cpp文件
//Matrix.cpp
#include <iostream>
#include "Matrix.h"
using namespace std;
void Matrix::setMatrix(int a, int b)//構(gòu)造函數(shù)可以取代這個(gè)
{
row=a;
col=b;
}
Matrix Matrix::operator + (Matrix &a)//重載 +
{
if (row!=a.row||col!=a.col)
{
throw"這兩個(gè)矩陣不可相加";
}
拋出異常,之所以使用這個(gè),是因?yàn)闆]法cout<<“錯(cuò)誤”;之后return 0強(qiáng)制退出,因?yàn)榉祷仡愋褪蔷仃嚕耶?dāng)時(shí)沒有嘗試?yán)胑xit()函數(shù)…(果然我太菜了QAQ)
else//矩陣元素相加
{
Matrix sum;//創(chuàng)建新矩陣,為接下來返回矩陣用
sum.row=row;
sum.col=col;
for(int i=0; i<sum.row; i++)
{
for(int j=0; j<sum.col; j++)
{
sum.matrix[i][j]=matrix[i][j]+a.matrix[i][j];//矩陣加法計(jì)算規(guī)則
}
}
return sum;//返回值為sum矩陣
}
}
計(jì)算規(guī)則需要自己確定(代幾應(yīng)該都學(xué)過),如這個(gè)是加法,規(guī)則如上:sum矩陣的各位置元素分別為’+‘前矩陣和’+'后矩陣對(duì)應(yīng)位置元素的和。
Matrix Matrix::operator-(Matrix &b)//重載 -
{
if (row!=b.row||col!=b.col)
{
throw"這兩個(gè)矩陣不可相減!";//拋出異常
}
else//矩陣元素相減
{
Matrix reduce;
reduce.row=row;
reduce.col=col;
for(int i=0; i<reduce.row; i++)
{
for(int j=0; j<reduce.col; j++)
{
reduce.matrix[i][j]=matrix[i][j]-b.matrix[i][j];//減法規(guī)則
}
}
return reduce;
}
}
減法和加法類似,可以模仿著加法來,注意下計(jì)算規(guī)則就行
Matrix Matrix::operator*(Matrix&c)
{
if (col!=c.row)
{
throw"這兩個(gè)矩陣不可相乘!";
}
else//矩陣元素相乘
{
Matrix multi;
multi.row=row;//新矩陣的行等于第一個(gè)矩陣的行
multi.col=c.col;//新矩陣的列等于第二關(guān)矩陣的列
for(int i=0; i<multi.row; i++)
{
for(int j=0; j<multi.col; j++)//為新矩陣元素賦值時(shí)注意新矩陣元素個(gè)數(shù)
{
multi.matrix[i][j]=0;//初始化新矩陣元素為0,為后面遞加做準(zhǔn)備
for(int k=0; k<col; k++)
{
multi.matrix[i][j]+=matrix[i][k]*c.matrix[k][j];//乘法計(jì)算規(guī)則
}
}
}
return multi;
}
}
關(guān)于矩陣乘法的規(guī)則可以拿張紙先演算一下,這樣方便自己理解。
bool Matrix::operator == (Matrix&d)//判斷矩陣是否相等
{
if (row!=d.row||col!=d.col)//先判斷行列是否相等
{
return false;
}
for(int i=0; i<row; i++)//再判斷元素是否相等,只要有一個(gè)不等,立刻返回false
{
for(int j=0; j<col; j++)
{
if(matrix[i][j]!=d.matrix[i][j])
{
return false;
}
}
}
return true;
}
bool Matrix::operator != (Matrix&e)//判斷矩陣是否不等
{
if (row!=e.row||col!=e.col)
{
return true;//原理同上,注意返回相反值
}
for(int i=0; i<row; i++)//原理同上,注意返回相反值
{
for(int j=0; j<col; j++)
{
if(matrix[i][j]!=e.matrix[i][j])
{
return true;
}
}
}
return false;
}
ostream& operator << (ostream &out,Matrix& mat)//重載輸出矩陣
{
for (int i = 0; i < mat.row; i++)
{
for (int j = 0; j < mat.col; j++)
{
out << mat.matrix[i][j];//將矩陣元素輸出,注意矩陣元素的間距
if (j == mat.col - 1)
out << endl;
else out << " ";
}
}
return out;//返回輸出流
}
istream& operator>>(istream&in, Matrix &mat)//重載輸入矩陣
{
for (int i = 0; i < mat.row; i++)
{
for (int j = 0; j < mat.col; j++)
{
in >> mat.matrix[i][j];//由行到列一次輸入元素
}
}
return in;//返回輸入流
}
以下為main.cpp,主要用于測試。
//main.cpp
#include <iostream>
#include "Matrix.h"
using namespace std;
int main()
{
int row, col;
Matrix A;
cout<<"Please input rows cols:\n";
cin>>row>>col;//輸入行列
A.setMatrix(row,col);//為矩陣設(shè)置行列
cout<<"Please input your matrix elements:\n";
cin>>A;//輸入元素,因?yàn)橐呀?jīng)重載了>>,所以可以直接在>>后面加矩陣類A
cout<<"以下是你創(chuàng)建的第一個(gè)矩陣!\n";
cout<<A<<endl;//輸出元素,因?yàn)橐呀?jīng)重載了<<,所以可以直接在<<后面加矩陣類A
Matrix B;//另一個(gè)矩陣
cout<<"Please input another one's rows cols:\n";
cin>>row>>col;
B.setMatrix(row,col);
cout<<"Please input your matrix elements:\n";
cin>>B;
cout<<"以下是你創(chuàng)建的第二個(gè)矩陣!\n";
cout<<B<<endl;
try//這是和throw,catch配合使用的關(guān)鍵字。具體使用可以谷歌或者百度
{
Matrix sum=A+B;
cout<<"兩個(gè)矩陣相加為:\n";
cout<<sum<<endl;
}
catch (const char* msg)//如果throw拋出了異常,會(huì)(根據(jù)情況)捕獲異常
{
cerr<< msg << endl;//打印異常語句
}
try
{
Matrix reduce=A-B;
cout<<"兩個(gè)矩陣相減為:\n";
cout<<reduce<<endl;
}
catch (const char* msg)
{
cerr<< msg << endl;
}
try
{
Matrix multi=A*B;
cout<<"兩個(gè)矩陣相乘為:\n";
cout<<multi<<endl;
}
catch (const char* msg)
{
cerr<< msg << endl;
}
if(A==B)//測試 == 是否重載成功
cout<<"兩個(gè)矩陣相等!( == 為真測試通過!)"<<endl;
else
cout<<"兩個(gè)矩陣不相等!( == 為假測試通過!)"<<endl;
if(A!=B)// 測試 !=是否重載成功
cout<<"矩陣不相等!( != 為真測試通過!)"<<endl;
else
cout<<"矩陣相等!( != 為假測試通過!)"<<endl;
return 0;
}
運(yùn)行結(jié)果
矩陣相乘:
矩陣相加減:
原文鏈接:https://blog.csdn.net/qq_43385653/article/details/89690676
相關(guān)推薦
- 2022-11-21 解析Rust?struct?中的生命周期_Rust語言
- 2022-08-14 C++學(xué)習(xí)之算術(shù)運(yùn)算符使用詳解_C 語言
- 2022-07-07 C++實(shí)現(xiàn)數(shù)組中元素組合出最大值_C 語言
- 2022-08-28 SpringCloudAlibaba-3.分布式事務(wù)(Seata)
- 2022-06-06 node中,如何手動(dòng)實(shí)現(xiàn)觸發(fā)垃圾回收機(jī)制
- 2022-09-01 Nginx?部署的虛擬主機(jī)使用?Let's?Encrypt?加密?https的方法_nginx
- 2022-12-22 使用PyCharm調(diào)試程序?qū)崿F(xiàn)過程_python
- 2022-09-08 關(guān)于keras中的Reshape用法_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支