C++實(shí)現(xiàn)重載矩陣的部分運(yùn)算符
前言
博主本人為C++菜鳥(niǎo)一只,本篇博客也是第一次寫(xiě),主要目的用于自己mark,如有錯(cuò)誤歡迎指出
本博客代碼為我做C++實(shí)驗(yàn)時(shí)的代碼,由于自己是菜鳥(niǎo),所以代碼內(nèi)容掌握的也不是很熟。
在此記下此篇,待到日后查看也是屬于自己青春的一部分吧。
正文
整個(gè)工程分為頭文件,source,以及main構(gòu)成。
工程的目的為實(shí)現(xiàn)對(duì)矩陣運(yùn)算符‘+’,‘-’,‘*’,‘==’,‘!=’,‘<<’和‘>>’的重載,并在main中測(cè)試其情況。
以下為頭文件
//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ù)可以完成該功能,甚至更完美。但我有些小懶,就不想去修改了,如果出事的話(huà)…QAQ還是希望不會(huì)出事吧。
還有就是,矩陣我設(shè)置成了200*200,其實(shí)可以利用new調(diào)用動(dòng)態(tài)內(nèi)存來(lá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)闆](méi)法cout<<“錯(cuò)誤”;之后return 0強(qiáng)制退出,因?yàn)榉祷仡?lèi)型是矩陣,我當(dāng)時(shí)沒(méi)有嘗試?yán)胑xit()函數(shù)…(果然我太菜了QAQ)
else//矩陣元素相加 { Matrix sum;//創(chuàng)建新矩陣,為接下來(lái)返回矩陣用 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é)過(guò)),如這個(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; } }
減法和加法類(lèi)似,可以模仿著加法來(lái),注意下計(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,主要用于測(cè)試。
//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)重載了>>,所以可以直接在>>后面加矩陣類(lèi)A cout<<"以下是你創(chuàng)建的第一個(gè)矩陣!\n"; cout<<A<<endl;//輸出元素,因?yàn)橐呀?jīng)重載了<<,所以可以直接在<<后面加矩陣類(lèi)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;//打印異常語(yǔ)句 } 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)//測(cè)試 == 是否重載成功 cout<<"兩個(gè)矩陣相等!( == 為真測(cè)試通過(guò)!)"<<endl; else cout<<"兩個(gè)矩陣不相等!( == 為假測(cè)試通過(guò)!)"<<endl; if(A!=B)// 測(cè)試 !=是否重載成功 cout<<"矩陣不相等!( != 為真測(cè)試通過(guò)!)"<<endl; else cout<<"矩陣相等!( != 為假測(cè)試通過(guò)!)"<<endl; return 0; }
運(yùn)行結(jié)果
矩陣相乘:
矩陣相加減:
以上就是C++實(shí)現(xiàn)重載矩陣的部分運(yùn)算符的詳細(xì)內(nèi)容,更多關(guān)于C++重載矩陣運(yùn)算符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Qt操作SQLite數(shù)據(jù)庫(kù)的教程詳解
SQLite是一款開(kāi)源、輕量級(jí)、跨平臺(tái)的數(shù)據(jù)庫(kù),無(wú)需server,無(wú)需安裝和管理配置。它的設(shè)計(jì)目標(biāo)是嵌入式的,所以很適合小型應(yīng)用,也是Qt應(yīng)用開(kāi)發(fā)種常用的一種數(shù)據(jù)庫(kù)。本文為大家介紹了Qt操作SQLite數(shù)據(jù)庫(kù)的示例,希望對(duì)大家有所幫助2022-12-12C語(yǔ)言中各種運(yùn)算類(lèi)型全面總結(jié)
C語(yǔ)言運(yùn)算符是說(shuō)明特定操作的符號(hào),它是構(gòu)造C語(yǔ)言表達(dá)式的工具,C語(yǔ)言的運(yùn)算異常豐富,除了控制語(yǔ)句和輸入輸出以外的幾乎所有的基本操作都為運(yùn)算符處理2022-04-04Qt實(shí)現(xiàn)TCP同步與異步讀寫(xiě)消息的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何在?Qt?中實(shí)現(xiàn)?TCP?客戶(hù)端和服務(wù)器的同步和異步讀寫(xiě)消息,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04用c語(yǔ)言實(shí)現(xiàn)和平精英的完整代碼
這篇文章主要介紹了用c語(yǔ)言實(shí)現(xiàn)和平精英的完整代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04C++ 關(guān)于MFC List Control 控件的總結(jié)
這篇文章主要介紹了C++ 關(guān)于MFC List Control 控件的總結(jié)的相關(guān)資料,十分的詳細(xì),有需要的朋友可以參考下2015-06-06