gpt4 book ai didi

c++ - 为什么我的程序在输入矩阵值时崩溃?

转载 作者:行者123 更新时间:2023-11-28 02:27:13 24 4
gpt4 key购买 nike

我正在为矩阵输入值。由于某人帮助修复了我的代码,它现在已被修改为 vector 而不是数组。但是,程序现在在输入矩阵 B 的元素后崩溃。而且,这很奇怪,但是在输入任一矩阵的列数后,程序允许我继续输入更多的值列数,然后提示我输入矩阵的元素。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
int x,y,i,j,m,n;
vector<vector<int> > A;
vector<vector<int> > B;
vector<vector<int> > C;


cout<<"Enter the number of rows for Matrix A: "<<endl;
cin>>x;
cout<<"Enter the number of rows for Matrix B: "<<endl;
cin>>y;

//dynamically resizeable array of dynamically resizeable arrays
A.resize(x); // allocate storage for x dimension.
for (i = 0; i < x; i++)
{
A[i].resize(y); // allocate storage for y dimension for this one x
for (j = 0; j < y; j++)
{
cin >> A[i][j];
}
cout << endl;
}

cout<<"\n\nEnter the elements of Matrix A: "<<endl;

for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
{
cin>>A[i][j];
}
cout<<endl;
}

cout<<"\n\nMatrix A :\n\n";

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

cout<<"********************************************************"<<endl;

cout<<"Enter the number of rows for Matrix B: "<<endl;
cin>>m;
cout<<"Enter the number of columns for Matrix B: "<<endl;
cin>>n;

B.resize(m); // allocate storage for x dimension.
for (i = 0; i < m; i++)
{
B[i].resize(n); // allocate storage for y dimension for this one x
for (j = 0; j < n; j++)
{
cin >> A[i][j];
}
cout << endl;
}

cout<<"\n\nEnter elements for Matrix B :\n\n";

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>B[i][j];
}
cout<<endl;
}


cout<<"\n\nMatrix B :\n\n";

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<"\t"<<B[i][j];
}
cout<<endl;
}

if(y==m)
{

for(i=0;i<x;i++)
{
for(j=0;j<n;j++)
{
C[i][j]=0;
for(int k=0;k<m;k++)
{
C[i][j]=C[i][j]+A[i][k]*B[k][j];
}
}
}

cout<<"*******************************************************"<<endl;

cout<<"\n\nMultiplication of Matrix A and Matrix B: \n\n";

for(i=0;i<x;i++)
{
for(j=0;j<n;j++)
{
cout<<"\t"<<C[i][j];
}
cout<<endl;
}
}
else
{
cout<<"\n\nMultiplication is not possible"<<endl;;
}

system("pause");
return 0;
}

最佳答案

你说矩阵是 20 x 1,但你的数组是 10 x 10。所以你的描述是错误的。

但话虽如此,如果您尊重数组是 10 x 10 的,您仍然可以挽救您的原始代码并且不会让它崩溃。您只需编写循环就可以做到这一点,这样您就不会超出数组边界,无论输入的是什么。

但是您不需要自己重写循环——您需要做的就是调整输入,使其不超过数组的边界。

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
const int MAXSIZE_X = 10;
const int MAXSIZE_Y = 10;
int A[MAXSIZE_X][MAXSIZE_Y], B[MAXSIZE_X][MAXSIZE_Y], C[MAXSIZE_X][MAXSIZE_Y];
int x,y,i,j,m,n;
int m_x, m_y; // used for inputting
cout<<"Enter the number of rows for Matrix A: "<<endl;
cin>> m_x;
cout<<"Enter the number of rows for Matrix B: "<<endl;
cin>> m_y;

// set the minimum value for x and y here
x = std::max(0, std::min(m_x, MAXSIZE_X));
y = std::max(0, std::min(m_y, MAXSIZE_Y));

//... Rest of the code to populate arrays
//...
cout<<"Enter the number of rows for Matrix B: "<<endl;
cin>>m_x;
cout<<"Enter the number of columns for Matrix B: "<<endl;
cin>>m_y;

// set the minimum allowed values for m and n
m = std::max(0, std::min(m_x, MAXSIZE_X));
n = std::max(0, std::min(m_y, MAXSIZE_Y));
//...
// Rest of the code goes here
//...
}

我所做的只是将输入的最小值分配给 xymn和数组的实际维度大小,使用 std::min。另请注意,我们如何通过确保值不低于 0(通过使用 std::max)来不允许使用负值。

执行此操作后,循环将不会超出数组的边界。底线是,如果你有限制,你应该限制你的数组,这样你就永远不会超过界限。

另请注意,如果您确实将大小更改为 20 x 1(通过更改 MAXSIZE_XMAXSIZE_Y 的值),则其余代码都不会需要改变。


编辑:

既然你已经改变了你原来的问题,我上面的回答就不再成立了。请不要这样做,因为现在其他人会丢失所给出答案的所有上下文以及您作为问题发布的内容。

鉴于此,您的新代码的问题是:

B.resize(m); // allocate storage for x dimension.
for (i = 0; i < m; i++)
{
B[i].resize(n); // allocate storage for y dimension for this one x
for (j = 0; j < n; j++)
{
cin >> A[i][j]; // <-- This is supposed to be B, not A
}
cout << endl;
}

此外,您不需要在循环中调用 vector::resize。您可以在一次调用中调整整个 vector 的大小,包括行和列。

例子:

A.resize(x, vector<int>(y, 0));

A 矩阵的大小调整为 x 行和 y 列。

另一个错误是您无法调整 C 或结果矩阵的大小。

所以为了四舍五入,代码应该是这样的:

//dynamically resizeable array of dynamically resizeable arrays
A.resize(x, vector<int>(y, 0));
for (i = 0; i < A.size(); i++)
{
for (j = 0; j < A[i].size(); j++)
cin >> A[i][j];
cout << endl;
}

cout << "Enter the number of rows for Matrix B: " << endl;
cin >> m;
cout << "Enter the number of columns for Matrix B: " << endl;
cin >> n;

B.resize(m, vector<int>(n, 0)); // allocate storage for x dimension.
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
cin >> B[i][j];
cout << endl;
}

// resize the resultant matrix accordingly
C.resize(x, vector<int>(n, 0));

我删除了所有只输出您输入的内容的绒毛,因为这对于理解真正需要做什么并不重要。

除此之外,std::vector 通过使用 vector::size() 函数知道它的大小。您应该不再需要使用 xy 等变量来表示项目的数量。使用据称包含 vector 维度的无关变量可能会导致在某个地方出现问题。

关于c++ - 为什么我的程序在输入矩阵值时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30134337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com