Пользовательский ввод в 2D массив (C ++) - PullRequest
0 голосов
/ 25 апреля 2018

Не уверен, почему цикл for не сохранит правильные значения в двумерном массиве, когда я печатаю для проверки.Есть идеи?

#include <iostream>
using namespace std;

int row, col; 

int main()
{
int num;
int val[row][col];

cout << "How many rows are there?" << endl;    
cin >> row;
cout << "How many columns are there?" << endl;
cin >> col;
cout << "Enter values for the matrix: " << endl;

for (int i = 0; i < row; i++)                 
{
    for (int j = 0; j < col; j++)
    {
        cin >> val[i][j]; 
    }   
}
return 0;
}

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

Во-первых, вы не можете иметь

int val[row][col];

, прежде чем строки и столбцы будут иметь известные значения.Во-вторых, этот тип инициализации двумерного массива является стандартным только в C.

Вам нужно будет вручную разместить массив в куче, используя оператор C ++ new [] (аналогично функции malloc в C).Однако это не идиоматический C ++, и весь смысл языка в том, чтобы избегать этого, поэтому я не буду объяснять, как это сделать.

Правильный способ C ++ для достижения того, что вы хотите, - это использовать стандарт:: vector, очень мощная оболочка для массивов в стиле C, которая автоматически выделяет и освобождает память для вас (и многих других).

Вот самый простой способ сделать это:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int row;
    cout << "How many rows are there?" << endl;
    cin >> row;

    int col;
    cout << "How many columns are there?" << endl;
    cin >> col;

    int num;
    cout << "Enter values for the matrix: " << endl;
    cin >> num;

    vector<vector<int>> values(col); //initialize outer vector with col inner vectors

    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            values[i].push_back(num);
        }
    }

    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << values[i][j];
        }

        cout << endl;
    }

    return 0;
}

Кроме того, я советую вам называть ваши переменные более значимыми и избегать использования пространства имен std.

РЕДАКТИРОВАТЬ: Исходя из того, как вы подходите к программе, я предполагаю, что в моем ответе вы знакомы с CЕсли это не так, и вы следуете книге или учебнику, вы должны найти лучшую книгу или учебник.

0 голосов
/ 25 апреля 2018

Если в C ++ поддерживаются массивы переменной длины, вы можете написать то, что вы хотели, просто сдвинув:

int val[row][col];

В точку, где известны row и col.Посмотрите этот пост: Почему массивы переменной длины не являются частью стандарта C ++? В противном случае ваш код имеет неопределенное поведение.Вы должны использовать динамическое распределение.

0 голосов
/ 25 апреля 2018

Это не делает то, что вы думаете, что делает.Прежде всего, row и col инициализируются нулями при запуске программы.Тогда у вас есть int val[row][col];, который не является допустимым C ++, а скорее массивом переменной длины C.Поскольку в этой точке row и col оба равны 0, этот массив будет иметь нулевую длину.

В вашем цикле вы затем читаете набор значений, перезаписывая то, что находится в стеке, и приводя к неопределенномуповедение.

Вместо этого вы должны использовать что-то, что выделяется динамически, например std::vector или соответствующий класс матрицы из выбранной вами математической библиотеки.Использование динамического выделения вручную (new int[row * col], как предложено Али), как правило, не рекомендуется, поскольку таким образом очень легко получить утечки памяти, особенно если возникают исключения.

0 голосов
/ 25 апреля 2018
#include <iostream>
using namespace std;

int main()
{
    int row, col; 

    cout << "How many rows are there?" << endl;    
    cin >> row;
    cout << "How many columns are there?" << endl;
    cin >> col;
    cout << "Enter values for the matrix: " << endl;

    // check if row and col > 0
    int* val = new int[row * col];

    for (int i = 0; i < row; i++)                 
    {
        for (int j = 0; j < col; j++)
        {
            cin >> val[i * col + j]; 
        }   
    }
    delete[] val;
    return 0;
}
...