编程通过转置找出矩阵是否对称

问题描述 投票:0回答:1

我认为问题在于指针 ptr 和新数组 ptr2 的指针的比较。但我一点也不确定。

首先,我让用户输入一个 2D 数组,然后我通过其指针将数组转换为 Transpose,并且由于 C++ 中的数组实际上是行主要顺序的 1D 数组,所以我尝试只比较指针的值两个数组都指向。 不知怎的,我不知道为什么,但它不起作用。 我知道这可能不是最有效的方法,但我想学习并知道为什么它不起作用。 谢谢你

#include <iostream>
using namespace std;


 bool transponierte ( int* ptr, int groesse, int c, int r ){
     bool symmetrisch; 
        int array_neu[r][c]; 
        for( int i = 0 ; i < c ; i ++){
            for ( int j = 0 ; j < r ; j++){
                array_neu[j][i] = *ptr;
                ptr++;
            }
            
        }
            int* ptr2 = &array_neu[0][0];
            for ( int i = 0 ; i < groesse ; i++){
                    if ( *ptr == *ptr2 ){
                        symmetrisch = true;
                    }
                    if ( *ptr != *ptr2){
                        symmetrisch = false;
                            break;
                    }
                    ptr++;
                    ptr2++;
            }

     return symmetrisch; 
 }

int main(){
int r,c;
cout << "how many columns " << endl;
cin >> c;
cout << "how many rows " << endl;
cin >> r;

int array [c][r];
int groesse = r*c;
for (int i = 0 ; i < r; i++){
    for ( int j = 0 ; j < c ; j++){ 
        cout << "type in elemts for the array" << endl;
        cin >> array[j][i];
    }
}

  bool trans = transponierte( (int*)array, groesse, c ,r);
    if ( trans == true){
        cout << "the matrix is not symmetric " << endl;
    }
    if( trans == false ){
        cout << "the matrix is not symmetric" << endl;
    }
    return 0;
}
c++ arrays pointers matrix
1个回答
0
投票

我期望这样的代码使用 std::vectorstd::vector 作为输入。

int array [c][r];
你的代码不是标准的C++

#include <cassert>
#include <vector>
#include <stdexcept>

class matrix_t
{
public:
    matrix_t(const std::vector<std::vector<int>>&& values) :
        m_values{values}
    {
        if ((m_values.size() == 0ul) || (m_values[0].size() == 0ul))
        {
            throw std::invalid_argument{"invalid matrix size"};
        }
    }

    bool is_symmetric()
    {
        auto size = m_values.size();
        // width and height match
        if ( size == m_values[0].size())
        {
            // we only have to check values
            // - not on diagonal (they always match)
            // - in top-right of matrix (otherwise we will check values twice)
            for(std::size_t row = 0; row < size; ++row)
            {
                for(std::size_t col = row + 1; col < size; ++col)
                {
                    auto& value1 = m_values[col][row];
                    auto& value2 = m_values[row][col];
                    if ( value1 != value2  ) 
                    {
                        return false;
                    }
                }
            }

            return true;
        }

        return false;
    }

private:
    std::vector<std::vector<int>> m_values;
};


int main()
{
    matrix_t m1{{{1,0},{0,1}}};
    assert(m1.is_symmetric());

    matrix_t m2{{{1,0,2},{0,1,0},{2,0,1}}};
    assert(m2.is_symmetric());

    matrix_t m3{{{1,2,3},{0,1,0},{2,0,1}}};
    assert(!m3.is_symmetric());
}
© www.soinside.com 2019 - 2024. All rights reserved.