当我输入矩阵的值时,为什么我的程序会崩溃?

时间:2015-05-08 23:36:03

标签: c++ matrix crash

我正在输入矩阵的值。由于有人帮助修复我的代码,它现在已被修改为矢量而不是数组。然而,在输入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;
}

2 个答案:

答案 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
   //...   
}

我所做的就是使用{{xymn分配输入的最小值和数组的实际尺寸大小std::min 1}}。另请注意我们如何通过确保值不低于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。您可以在一次调用中调整整个向量(行和列)的大小。

示例:

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等变量来表示项目数。使用可能存在矢量尺寸的无关变量可能会导致某些地方出现问题。