通过 Transpose 判断矩阵是否对称的程序

问题描述 投票: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.