使用数组创建矩阵
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 数组必须有一个编译时常量值。您可以使用 const
或 constexpr
甚至像 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
的说法。然后,您需要使用使用 new
和 delete
的旧式内存分配方法。这是一种 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;
}
}
}
如前所述,经常被教导,但强烈反对。
我制作了一个数组矩阵并用于循环,问题是它只显示我最后的输入。 请参考下面的示例结果。
#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 数组必须有一个编译时常量值。您可以使用 const
或 constexpr
甚至像 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
的说法。然后,您需要使用使用 new
和 delete
的旧式内存分配方法。这是一种 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;
}
}
}
如前所述,经常被教导,但强烈反对。