使用数组创建矩阵

Creating matrix using array

我制作了一个数组矩阵并用于循环,问题是它只显示我最后的输入。 请参考下面的示例结果。

#include<iostream>
using namespace std;
int main()
 {
   int x = 0, y = 0;
   int a[x][y], i, j;

cout<<"Enter number of Columns: ";
cin>>y;

cout<<"Enter number of Rows: ";
cin>>x;

       cout<<endl;

 for(i=0; i<x; i++)
{
        cout<<endl;
        cout<<"Enter values or row/s: ";
        cout<<endl;
                            
for(j=0; j<y; j++)
{
    cout<<endl;
    
    cout<<"Row "<< i+1 << ": ";
    cin >> a[i][j]; 
   }
   }

cout<<endl;

cout<<"Entered Matrix is: ";

cout<<endl;

for(i=0; i<x; i++)
{
    for(j=0; j<y; j++)
    
        cout<<a[i][j]<<"  ";
        
    cout<<endl;
    
     }


   }

样本结果:

输入列数:3

输入行数:2

输入值或row/s:

第 1 行:-1

第 1 行:-2

第 1 行:-3

输入值或row/s:

第 2 行:4

第 2 行:5

第 2 行:-6

输入的矩阵是:

4 5 -6

4 5 -6

只需像这样更改数组声明:

int[x][y] 到 int[10][10]

这里的问题是您想使用大小可变的数组。因此,输入“x”和“y”,然后将其用作数组大小。 (array[x][y])

这在 C++ 中不起作用。在 C++ 中没有所谓的动态 VLA(可变长度数组)。

有一些方言或编译器扩展可以处理 VLA,但 C++ 不允许 VLA。

这意味着,你不能写这样的东西:

int arraySize{}; 
std::cin >> arraySize;
int array[arraySize];

这是无效的 C++ 代码。

C-Style 数组必须有一个编译时常量值。您可以使用 constconstexpr 甚至像 42 这样的数字文字来定义它。魔术常数是 42 或最坏的解决方案。无论如何,你可以写

constepxr int arraySize = 42; 
int array[arraySize];

这在语法上是正确的。

但是,这对你没有帮助。因为你需要一些“动态”的东西。 C++ 中惯用的正确方法是使用 std::vector。请阅读 here。使用 2d std::vector C++ 解决方案看起来像这样:

#include <iostream>
#include <vector>

int main() {
    // Get user input. Size of matrix. Number of rows and columns
    std::cout << "\nEnter number of Rows:      ";
    if (size_t numberOfRows{}; (std::cin >> numberOfRows) and (numberOfRows > 0)) {

        std::cout << "\nEnter number of columns:   ";
        if (size_t numberOfColumns{}; (std::cin >> numberOfColumns) and (numberOfColumns > 0)) {

            // Define 2d matrix and initialze all values to 0
            std::vector<std::vector<int>> matrix(numberOfRows, std::vector<int>(numberOfColumns, 0));

            // Read all values of matrix
            std::cout << "\n\Please enter matrix values in row-column order:\n";
            for (std::vector<int>& row : matrix)
                for (int& column : row)
                    std::cin >> column;

            // Now show matrix
            std::cout << "\n\nThe entered Matrix is:\n\n";
            for (std::vector<int>& row : matrix) {
                for (int& column : row) std::cout << column << ' ';
                std::cout << '\n';
            }
        }
    }
}

但是,接下来,我们经常听到您还没有了解 std::vector 的说法。然后,您需要使用使用 newdelete 的旧式内存分配方法。这是一种 non-recommend 方法,但出于教学目的,仍经常使用。

因此,您首先分配内存以保存指向 array(对于行)的指针,然后为行中的列分配内存。

这将如下所示:

#include <iostream>

int main() {
    // Get user input. Size of matrix. Number of rows and columns
    std::cout << "\nEnter number of Rows:      ";
    if (size_t numberOfRows{}; (std::cin >> numberOfRows) and (numberOfRows > 0)) {

        std::cout << "\nEnter number of columns:   ";
        if (size_t numberOfColumns{}; (std::cin >> numberOfColumns) and (numberOfColumns > 0)) {

            // Define 2d matrix 
            int** matrix;
            matrix = new int* [numberOfRows];
            for (int row = 0; row < numberOfRows; ++row)
                matrix[row] = new int[numberOfColumns];
            

            // Read all values of matrix
            std::cout << "\n\Please enter matrix values in row-column order:\n";
            for (int row = 0; row < numberOfRows; ++row)
                for (int column=0; column < numberOfColumns; ++column)
                    std::cin >> matrix[row][column];

            // Now show matrix
            std::cout << "\n\nThe entered Matrix is:\n\n";
            for (int row = 0; row < numberOfRows; ++row) {
                for (int column = 0; column < numberOfColumns; ++column) std::cout << matrix[row][column] << ' ';
                std::cout << '\n';
            }

            // Release memory
            for (int row = 0; row < numberOfRows; ++row)
                delete [] matrix[row];
            delete matrix;
        }
    }
}

如前所述,经常被教导,但强烈反对。