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

Why is my program crashing when I enter the values for a 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;
}

一个 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 矩阵。

当函数结束时,这个矢量小动物会自动清理。大家都很开心。

注意 vector<vector<int> > A; 中的 > > 中的 space 你需要这个 space 用于较旧的编译器,因为 >> 告诉编译器将数据右移,不终止模板参数列表。可怜的、混乱的编译器会抛出一连串可怕的错误消息,没有人愿意仔细阅读或解释。

你说矩阵是 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 的值),其余代码的 none 将需要改变。


编辑:

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

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

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 等变量来表示项目数。使用据称包含向量维度的无关变量可能会导致在某处出错。