2D целочисленный массив в C ++ с неравным количеством элементов в каждой строке - PullRequest
3 голосов
/ 07 февраля 2020

Количество строк и столбцов этого массива задается пользователем, однако количество строк не одинаково (массив неравномерен), а также пользователь заполняет массив, вводя элементы.

Это код, который я написал, но когда я пытаюсь получить ввод от пользователя, код падает после получения некоторых входных данных. Пожалуйста, не могли бы вы помочь мне исправить мой код и указать мой fl aws. Спасибо.

#include <iostream>
//2d array
using namespace std;

int main()
{
    int row;
    int col_x;
    cout << "Enter the row number:" << endl;
    cin >> row;
    //cout<<"Enter the column number:"<<endl;
    //cin>>col;
    int **a = new int *[row];
    for (int r = 0; r < row; r++)
    {
        cout << "Enter the column no.of array " << r << endl;
        cin >> col_x;
        a[r] = new int[col_x];

        cout << "Enter the elements in the array:" << endl;
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col_x; j++)
            {
                cin >> a[i][j];
            }
        }
        cout << "The elements in the array:" << endl;
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col_x; j++)
            {
                cout << a[i][j] << " ";
            }
            cout << endl;
        }
    }

    delete[] a;
    a = NULL;

    return 0;
}

Ответы [ 4 ]

3 голосов
/ 07 февраля 2020

Была доплата за л oop. Кроме того, вы должны хранить размер каждой строки. И сделать правильное освобождение 2D-массива.

#include <iostream>
//2d array
using namespace std;

int main()
{
    int row;
    cout<<"Enter the row number:"<<endl;
    cin>>row;
    int **a=new int *[row];
    int *col_x = new int [row];

    for(int r=0;r<row;r++){
        cout<<"Enter the column no.of array "<<r<<endl;
        cin>>col_x[r];
        a[r]=new int[col_x[r]];

        cout<<"Enter the elements in the array:"<<endl;

        for(int j=0;j<col_x[r];j++){
            cin>>a[r][j];
        }
    }

    cout<<"The elements in the array:"<<endl;
     for(int i=0;i<row;i++){
        for(int j=0;j<col_x[i];j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }

    for (int i=0; i<row; ++i)
        delete[] a[i];
    delete []a;
    delete []col_x;
    return 0;
}

2 голосов
/ 07 февраля 2020

Поскольку вы используете C ++, вы должны воспользоваться контейнерами, которые он предоставляет для хранения ваших данных, в этом случае будет уместен вектор векторов:

Live Sample

#include <iostream>
#include <vector>

using namespace std; //<-- for test, souldn't be used

int main() {

    int rows, cols, temp;
    vector<vector<int>> matrix;

    cout << "Enter the row number:" << endl;
    cin >> rows;

    for (int i = 0; i < rows; i++){
        vector<int> v;
        cout << "Enter the column no.of array " << i << endl;
        cin >> cols;
        cout << "The elements in the array:" << endl;
        for (int j = 0; j < cols; j++){
            cin >> temp;
            v.push_back(temp);
        }
        matrix.push_back(v);
    }
    cout << endl;
    for( auto i: matrix){   //print results
        for(int j: i)
            cout << j << " ";
        cout << endl;
    }
}
2 голосов
/ 07 февраля 2020

Способ, которым вы получаете ввод от пользователя, очень расплывчатый и склонен к доступу к недействительной памяти. Вы получаете один и тот же ряд много раз во внутреннем l oop. Попробуйте что-то вроде этого:

#include <iostream>
 //2d array
using namespace std;

int main() {
  int row;
  int col_x;
  cout << "Enter the row number:" << endl;
  cin >> row;
  //cout<<"Enter the column number:"<<endl;
  //cin>>col;
  int ** a = new int * [row];
  for (int r = 0; r < row; r++) {
    cout << "Enter the column no.of array " << r << endl;
    cin >> col_x;
    a[r] = new int[col_x];

    cout << "Enter the elements in the array:" << endl;
    for (int j = 0; j < col_x; j++) {
      cin >> a[r][j];
    }
  }
  cout << "The elements in the array:" << endl;
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col_x; j++) {
      cout << a[i][j] << " ";
    }
    cout << endl;
  }
  delete[] a;
  a = NULL;
  return 0;
}

Также обратите внимание, что col_x будет содержать только размер последней строки. Таким образом, он не работает для печати в конце кода.

2 голосов
/ 07 февраля 2020

Не уверен, что вы пытаетесь достичь, но основная проблема с приведенным выше кодом заключается в том, что вы обращаетесь к несуществующим элементам вашего массива. Может быть, ваш l oop over r должен заканчиваться строкой 18? Даже тогда вам придется хранить число столбцов в строке в некоторой внешней переменной. Я бы предложил использовать std::vector в качестве контейнера вместо фиксированных массивов, в вашем случае std::vector< std::vector<int> >. У векторного класса есть метод size(), в котором хранится его фактический размер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...