【问题标题】:Fill a symmetric matrix in c++在 C++ 中填充对称矩阵
【发布时间】:2020-08-23 16:55:38
【问题描述】:

判断一个多维数组的元素是否存在的条件有问题
例如 arr[row][col] 正是 arr[col][row] 然后自动将 arr[col][row] 的值分配给相同的值arr[row][col] 不让用户手动输入

这应该是输出的一个例子

example[4][4] = 
     {
     //   0   1   2   3
        { 0, 10, 15, 18},   //   0
        { 10, 0, 20, 14},   //   1
        { 15, 20, 0, 90},   //   2
        { 18, 14,90, 0},    //   3

这是我的代码

`   int size;
    int arr[size][size];
    cout<<"Choose size of your multidimensional array [matrix]: ",cin>>size;
    cout<<"Now enter your data [Respectively] \n";
    for(int d=0 ; d<size ; d++)
    {
        for(int j=0; j<size; j++)
        {
            if (d==j) 
            {
                arr[d][j]=0 ;
            }
            else if(arr[d][j]!=0 ) //there should be the problem
            {
                arr[j][d]=arr[d][j];
            }
            else
            {
                cin>>arr[d][j]; // Filling matrix
            }
        }
    }  `

【问题讨论】:

  • &amp;arr[d][j]==&amp;arr[j][d] --> arr[d][j]== arr[j][d]。为什么要比较地址?此外,int arr[size][size] 不是有效的 c++。
  • int arr[size][size]; 这里 size 使用未初始化
  • 请注意,VLA:s(可变长度数组)不是标准 C++ 的一部分。 Why aren't variable-length arrays part of the C++ standard?
  • “好吧(使用未定义行为的代码)确实有效”这就是未定义行为的有趣之处。有时它甚至可能会起作用,这是最阴险的。
  • @Gradzidsa 如果您希望程序可移植,请不要使用int arr[size][size];。相反,使用std::vector&lt;std::vector&lt;int&gt;&gt; arr(size, std::vector&lt;int&gt;(size));

标签: c++ matrix multidimensional-array


【解决方案1】:

这是一个可以解决您的问题的最小工作示例 (MWE):

#include <iostream>

using namespace std;

int main()
{
    cout << "Choose size of your multidimensional array [matrix]: ";
    int size;
    cin >> size;
    int arr[size][size];
    cout << "Now enter your data [Respectively] \n";
    for(int d=0; d<size; d++)
    {
        for(int j=d+1; j<size; j++)
        {
            if (d==j)
            {
                arr[d][j] = 0;
            }
            else if(j<d)      // here laid the problem
            {
                arr[d][j] = arr[j][d];
            }
            else
            {
                cin >> arr[d][j]; // Filling matrix
            }
        }
    }

    // print matrix
    for(int d=0; d<size; d++) {
        for(int j=0; j<size; j++)
            cout << arr[d][j] << " ";
        cout << '\n';
    }

return 0;
}

下面这个更干净了,去掉了内部循环中的条件,谢谢@ThomasSablik

#include <iostream>

using namespace std;

int main()
{
    cout << "Choose size of your multidimensional array [matrix]: ";
    int size;
    cin >> size;
    int arr[size][size];
    cout << "Now enter your data [Respectively] \n";

    for(int d=0 ; d<size ; d++)
    {
        arr[d][d]=0;
        for(int j=d+1; j<size; j++)
        {
            cin >> arr[d][j];
            arr[j][d]=arr[d][j];
        }
    }

    // print matrix
    for(int d=0; d<size; d++) {
        for(int j=0; j<size; j++)
            cout << arr[d][j] << " ";
        cout << '\n';
    }

return 0;
}

【讨论】:

  • for(int j=0; j&lt;size; j++) => for(int j=d; j&lt;size; j++)cin &gt;&gt; arr[d][j]; => cin &gt;&gt; arr[d][j]; arr[j][d] = arr[d][j]; 允许删除第二种情况。
  • 你的解决方案给了我一个很好的提示,并设法做了一个小的编辑谢谢!!
  • @ThomasSablik :谢谢,非常聪明,我们甚至可以通过在第二个内部 for 循环前面加上 arr[d][d]=0; 来完全摆脱条件。
  • @Gradzidsa:很高兴能帮上忙!如果它解决了您的问题,您应该将我的答案打勾为已接受的答案,旁边的绿色“V”打勾,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
相关资源
最近更新 更多