我正在输入矩阵的值。由于有人帮助修复我的代码,它现在已被修改为矢量而不是数组。然而,在输入Matrix 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;
}
答案 0 :(得分:1)
20x1矩阵
int A[10][10]
在最大大小为10的数组中获取20个元素会有点困难。
尝试:
cout<<"Enter the number of rows for Matrix A: "<<endl;
cin>>x;
cout<<"Enter the number of rows for Matrix B: "<<endl;
cin>>y;
cout << "\n\nEnter the elements of Matrix A: " << endl;
int ** A; // raw pointer. Not a good idea.
A = new int*[x]; // allocate storage for x dimension.
for (i = 0; i < x; i++)
{
A[i] = new int[y]; // allocate storage for y dimension for this one x
for (j = 0; j < y; j++)
{
cin >> A[i][j];
}
cout << endl;
}
但是最后你有很多删除[]来释放所有内存。所以在程序文件的顶部:
#include<iostream>
#include<vector>
using namespace std;
在主要用户输入的地方:
vector<vector<int> > A; //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;
}
在我编辑时,将输入代码移动到某个功能是有价值的,因此您不必重复它来读取B矩阵。
此功能结束后,此矢量beastie会自动清除。祝所有人快乐。
请注意> >
中vector<vector<int> > A;
中的空格您需要此空间用于较旧的编译器,因为>>
告诉编译器要正确地移位数据,而不是终止模板参数列表。这个可怜的,混乱的编译器会抛出一连串错误消息,没有人愿意通过或解释。
答案 1 :(得分:1)
你说矩阵是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
//...
}
我所做的就是使用{{x
,y
,m
和n
分配输入的最小值和数组的实际尺寸大小std::min
1}}。另请注意我们如何通过确保值不低于0(使用std::max
)来允许使用负值。
一旦这样做,循环现在不会超过数组的边界。最重要的是,如果你有一个限制,你应该重新调整你的数组,以便你永远不会超过界限。
另请注意,如果您确实将大小更改为20 x 1(通过更改MAXSIZE_X
和MAXSIZE_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
。您可以在一次调用中调整整个向量(行和列)的大小。
示例:
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()
函数知道其大小。您不再需要随身携带x
,y
等变量来表示项目数。使用可能存在矢量尺寸的无关变量可能会导致某些地方出现问题。