欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現(xiàn)重載矩陣的部分運算符

 更新時間:2022年10月28日 11:21:20   作者:青空を越えて  
這篇文章主要為大家詳細(xì)介紹了如何利用C++實現(xiàn)重載矩陣的部分運算符,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下

前言

博主本人為C++菜鳥一只,本篇博客也是第一次寫,主要目的用于自己mark,如有錯誤歡迎指出

本博客代碼為我做C++實驗時的代碼,由于自己是菜鳥,所以代碼內(nèi)容掌握的也不是很熟。

在此記下此篇,待到日后查看也是屬于自己青春的一部分吧。

正文

整個工程分為頭文件,source,以及main構(gòu)成。

工程的目的為實現(xià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ù)可以不設(shè)置,利用構(gòu)造函數(shù)可以完成該功能,甚至更完美。但我有些小懶,就不想去修改了,如果出事的話…QAQ還是希望不會出事吧。

還有就是,矩陣我設(shè)置成了200*200,其實可以利用new調(diào)用動態(tài)內(nèi)存來更好的實現(xiàn),但由于我太菜,不想去用二重指針,故放棄了這個方案。

以下為cpp文件

//Matrix.cpp
#include <iostream>
#include "Matrix.h"

using namespace std;

void Matrix::setMatrix(int a, int b)//構(gòu)造函數(shù)可以取代這個
{
    row=a;
    col=b;
}

Matrix Matrix::operator + (Matrix &a)//重載 +
{
    if (row!=a.row||col!=a.col)
    {
        throw"這兩個矩陣不可相加";
    }

拋出異常,之所以使用這個,是因為沒法cout<<“錯誤”;之后return 0強制退出,因為返回類型是矩陣,我當(dāng)時沒有嘗試?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];//矩陣加法計算規(guī)則
            }
        }
        return sum;//返回值為sum矩陣
    }
}

計算規(guī)則需要自己確定(代幾應(yīng)該都學(xué)過),如這個是加法,規(guī)則如上:sum矩陣的各位置元素分別為’+‘前矩陣和’+'后矩陣對應(yīng)位置元素的和。

Matrix Matrix::operator-(Matrix &b)//重載 -
{
    if (row!=b.row||col!=b.col)
    {
        throw"這兩個矩陣不可相減!";//拋出異常
    }
    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;
    }
}

減法和加法類似,可以模仿著加法來,注意下計算規(guī)則就行

Matrix Matrix::operator*(Matrix&c)
{
    if (col!=c.row)
    {
        throw"這兩個矩陣不可相乘!";
    }
    else//矩陣元素相乘
    {
        Matrix multi;
        multi.row=row;//新矩陣的行等于第一個矩陣的行
        multi.col=c.col;//新矩陣的列等于第二關(guān)矩陣的列
        for(int i=0; i<multi.row; i++)
        {
            for(int j=0; j<multi.col; j++)//為新矩陣元素賦值時注意新矩陣元素個數(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];//乘法計算規(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++)//再判斷元素是否相等,只要有一個不等,立刻返回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;//輸入元素,因為已經(jīng)重載了>>,所以可以直接在>>后面加矩陣類A
    cout<<"以下是你創(chuàng)建的第一個矩陣!\n";
    cout<<A<<endl;//輸出元素,因為已經(jīng)重載了<<,所以可以直接在<<后面加矩陣類A
    Matrix B;//另一個矩陣
    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)建的第二個矩陣!\n";
    cout<<B<<endl;
    try//這是和throw,catch配合使用的關(guān)鍵字。具體使用可以谷歌或者百度
    {
        Matrix sum=A+B;
        cout<<"兩個矩陣相加為:\n";
        cout<<sum<<endl;
    }
    catch (const char* msg)//如果throw拋出了異常,會(根據(jù)情況)捕獲異常
    {
        cerr<< msg << endl;//打印異常語句
    }
    try
    {
        Matrix reduce=A-B;
        cout<<"兩個矩陣相減為:\n";
        cout<<reduce<<endl;
    }
    catch (const char* msg)
    {
        cerr<< msg << endl;
    }
    try
    {
        Matrix multi=A*B;
        cout<<"兩個矩陣相乘為:\n";
        cout<<multi<<endl;
    }
    catch (const char* msg)
    {
        cerr<< msg << endl;
    }
    if(A==B)//測試 == 是否重載成功
        cout<<"兩個矩陣相等!( == 為真測試通過!)"<<endl;
    else
        cout<<"兩個矩陣不相等!( == 為假測試通過!)"<<endl;
    if(A!=B)// 測試 !=是否重載成功
        cout<<"矩陣不相等!( != 為真測試通過!)"<<endl;
    else
        cout<<"矩陣相等!( != 為假測試通過!)"<<endl;
    return 0;
}

運行結(jié)果

矩陣相乘:

矩陣相加減:

以上就是C++實現(xiàn)重載矩陣的部分運算符的詳細(xì)內(nèi)容,更多關(guān)于C++重載矩陣運算符的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Qt操作SQLite數(shù)據(jù)庫的教程詳解

    Qt操作SQLite數(shù)據(jù)庫的教程詳解

    SQLite是一款開源、輕量級、跨平臺的數(shù)據(jù)庫,無需server,無需安裝和管理配置。它的設(shè)計目標(biāo)是嵌入式的,所以很適合小型應(yīng)用,也是Qt應(yīng)用開發(fā)種常用的一種數(shù)據(jù)庫。本文為大家介紹了Qt操作SQLite數(shù)據(jù)庫的示例,希望對大家有所幫助
    2022-12-12
  • C語言中各種運算類型全面總結(jié)

    C語言中各種運算類型全面總結(jié)

    C語言運算符是說明特定操作的符號,它是構(gòu)造C語言表達(dá)式的工具,C語言的運算異常豐富,除了控制語句和輸入輸出以外的幾乎所有的基本操作都為運算符處理
    2022-04-04
  • 詳解Dijkstra算法之最短路徑問題

    詳解Dijkstra算法之最短路徑問題

    Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計算一個節(jié)點到其他所有節(jié)點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。本文將介紹其原理,并用C++實現(xiàn)
    2021-06-06
  • Qt實現(xiàn)TCP同步與異步讀寫消息的示例代碼

    Qt實現(xiàn)TCP同步與異步讀寫消息的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何在?Qt?中實現(xiàn)?TCP?客戶端和服務(wù)器的同步和異步讀寫消息,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • 用c語言實現(xiàn)和平精英的完整代碼

    用c語言實現(xiàn)和平精英的完整代碼

    這篇文章主要介紹了用c語言實現(xiàn)和平精英的完整代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C++11原子操作詳解

    C++11原子操作詳解

    這篇文章主要為大家介紹了C++的原子操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++ 關(guān)于MFC List Control 控件的總結(jié)

    C++ 關(guān)于MFC List Control 控件的總結(jié)

    這篇文章主要介紹了C++ 關(guān)于MFC List Control 控件的總結(jié)的相關(guān)資料,十分的詳細(xì),有需要的朋友可以參考下
    2015-06-06
  • C++中檢查vector是否包含給定元素的幾種方式詳解

    C++中檢查vector是否包含給定元素的幾種方式詳解

    這篇文章主要介紹了C++中檢查vector是否包含給定元素的幾種方式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • C語言分治法實現(xiàn)歸并排序

    C語言分治法實現(xiàn)歸并排序

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)歸并排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 亞馬遜經(jīng)典面試題實例詳解

    亞馬遜經(jīng)典面試題實例詳解

    這篇文章主要介紹了亞馬遜經(jīng)典面試題實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10

最新評論