Получение странного вывода для динамического размещения массива 2d. Как я могу решить проблему? - PullRequest
0 голосов
/ 23 июня 2019

Я хочу создать динамический 2d массив и хочу выполнить операцию над ним. Однако, когда я печатаю матрицу, в первом столбце отображаются разные цифры, и я не знаю, откуда она?

Я пытался изменить значение с array[i][j] на *(*(array+i)+j), и все равно получаю тот же результат.

int main ()
{
  int sum=0,diagsum=0;
  int rowSize,colSize;
  std::cout << "Input Row size of the matrix" << '\n';
  std::cin >> rowSize;
  std::cout << "Input Column size of the matrix" << '\n';
  std::cin >> colSize;

  int** arrayA = new int*[rowSize];   //declaring array dynamically.

  for(int m=0;m<rowSize;++m)
  {
    arrayA[m] = new int[colSize];
  }

  //Creating matrix A of size rowSize x colSize with random of first 30
  for(int i = 0;i<rowSize;++i)
  {
    for(int j = 1;j<=colSize;++j)
    {
      arrayA[i][j]=rand() % 30;
    }
  }


  std::cout << "Matrix A is of size"<< rowSize << " X " << colSize << '\n';

  //printing Matrix A
  for(int i = 0;i<rowSize;++i)
  {
    for(int j = 0;j<=colSize;++j)
    {
      std::cout << arrayA[i][j] << "\t";
    }
    std::cout << '\n';
  }

  //sum of element of the matrix
  for(int i = 0;i<rowSize;i++)
  {
    for(int j=0;j<colSize;j++)
    {
      sum = sum + arrayA[i][j];
    }
    std::cout << '\n';
  }

  // sum of elet of diagonal of matirx
  for(int i = 0;i<rowSize;i++)
  {
      diagsum = diagsum + arrayA[i][i];
  }

  std::cout << "sum of the element of matrix is"<< sum << '\n';

  std::cout << "Diagonal sum is" << diagsum <<'\n';


//deleting mem for the array.
  for(int m=0;m<1000;m++)
  {
    delete[] arrayA[m];
  }

  delete[] arrayA;

  return 0;
}

Фактический результат:

Input Row size of the matrix
5
Input Column size of the matrix
5
Matrix A is of size5 X 5
9140960 11      17      4       10      29
9140960 4       18      18      22      14
9140960 5       5       1       27      1
9140960 11      25      2       27      6
9115176 21      24      2       3       22

sum of the element of matrix is45679273
Diagonal sum is9140974

===================================

Ожидаемый результат:

Input Row size of the matrix
5
Input Column size of the matrix
5
Matrix A is of size5 X 5
11      17      4       10      29
4       18      18      22      14
5       5       1       27      1
11      25      2       27      6
21      24      2       3       22

1 Ответ

3 голосов
/ 23 июня 2019

Где у вас есть for(int j = 1;j<=colSize;++j), это должно быть for(int j = 0; j < colSize;++j).Везде у вас <= colSize должно быть < colSize.Там, где у вас есть m<1000, должно быть m < rowSize, например

#include <iostream>

int main (void)
{
    int sum=0,diagsum=0;
    int rowSize,colSize;
    std::cout << "Input Row size of the matrix" << '\n';
    std::cin >> rowSize;
    std::cout << "Input Column size of the matrix" << '\n';
    std::cin >> colSize;

    int** arrayA = new int*[rowSize];   //declaring array dynamically.

    for(int m=0;m<rowSize;++m)
    {
        arrayA[m] = new int[colSize];
    }

    //Creating matrix A of size rowSize x colSize with random of first 30
    for(int i = 0; i < rowSize; ++i)
    {
        for(int j = 0; j < colSize; ++j)
        {
            arrayA[i][j]=rand() % 30;
        }
    }


    std::cout << "Matrix A is of size"<< rowSize << " X " << colSize << '\n';

    //printing Matrix A
    for(int i = 0;i < rowSize; ++i)
    {
        for(int j = 0; j < colSize; ++j)
        {
            std::cout << arrayA[i][j] << "\t";
        }
        std::cout << '\n';
    }

    //sum of element of the matrix
    for(int i = 0; i < rowSize; i++)
    {
        for(int j = 0; j < colSize; j++)
        {
            sum = sum + arrayA[i][j];
        }
        std::cout << '\n';
    }

    // sum of elet of diagonal of matirx
    for(int i = 0; i < rowSize; i++)
    {
        diagsum = diagsum + arrayA[i][i];
    }

    std::cout << "sum of the element of matrix is"<< sum << '\n';

    std::cout << "Diagonal sum is" << diagsum <<'\n';


    //deleting mem for the array.
    for(int m = 0; m < rowSize; m++)
    {
        delete[] arrayA[m];
    }

    delete[] arrayA;

    return 0;
}

( примечание: , если вы разместите декомпозиции цикла немного больше, ошибки будет легче обнаружить.Также будьте совместимы с ++j или j++)

( также обратите внимание: вы можете собрать sum и diagsum в одном цикле, просто проверив if (i == j) diagsum += arrayA[i][j];)

Вы также должны проверить свой пользовательский ввод, например,

    if (!(std::cin >> rowSize)) {
        std::cerr << "error: invalid rowSize\n";
        return 1;
    }

В противном случае вы находитесь на расстоянии одного шага клавиатуры от неопределенного поведения.

Пример использования/ Вывод

$ ./bin/array_dyn_rand
Input Row size of the matrix
5
Input Column size of the matrix
5
Matrix A is of size5 X 5
13      16      27      25      23
25      16      12      9       1
2       7       20      19      23
16      0       6       22      16
11      8       27      9       2





sum of the element of matrix is355
Diagonal sum is73

Вы должны удалить std::cout << '\n'; из своего цикла, вычисляя sum, это совершенно не нужно.

Поскольку вы используете rand() из C stdlib.h, вы должны заполнить генератор случайных чисел, позвонив srand() до вашего первого вызова на rand(), обычно инициализируемый секундами с начала эпохи, например,

#include <ctime>
...
    srand (time(NULL));     /* seed the random number generator */

( примечание: C ++ предоставляет свои собственные Генерация псевдослучайных чисел подпрограмм)

Просто немного очистите ваш код для полученияДля удобства использования и объединения вычислений sum и diagsum в одном цикле можно выполнить:

#include <iostream>
#include <ctime>

int main (void)
{
    int sum=0,
        diagsum=0,
        rowSize,
        colSize;

    std::cout << "Input Row size of the matrix: ";
    if (!(std::cin >> rowSize)) {       /* validate EVERY user-input */
        std::cerr << "error: invalid rowSize\n";
        return 1;
    }
    std::cout << "Input Col size of the matrix: ";
    if (!(std::cin >> colSize)) {
        std::cerr << "error: invalid colSize\n";
        return 1;
    }

    srand (time(NULL));     /* seed the random number generator */

    int **arrayA = new int* [rowSize];  /* allocate rowSize pointers */

    for(int m = 0;m < rowSize; m++)     /* allocate colSize ints per-row */
        arrayA[m] = new int[colSize];

    /* Populate rowSize rows x colSize columns with random 0 - 29 */
    for (int i = 0; i < rowSize; i++)
        for (int j = 0; j < colSize; j++)
            arrayA[i][j]=rand() % 30;


    std::cout << "\nMatrix A is of size " << rowSize << " x " << colSize 
                << "\n\n";

    // printing Matrix A
    for (int i = 0; i < rowSize; i++) {
        for (int j = 0; j < colSize; j++)
            std::cout << arrayA[i][j] << "\t";
        std::cout << '\n';
    }

    // sum of elements and diagonal of the matrix
    for (int i = 0; i < rowSize; i++) {
        for(int j = 0; j < colSize; j++) {
            if (i == j)
                diagsum += arrayA[i][j];
            sum = sum + arrayA[i][j];
        }
    }

    std::cout << "\nsum of the element of matrix is: "<< sum << '\n'
                << "Diagonal sum is: " << diagsum <<'\n';

    // deleting mem for the array.
    for (int m = 0; m < rowSize; m++)
        delete[] arrayA[m];             /* delete storage for rows */
    delete[] arrayA;                    /* delete pointers */

    return 0;
}

Пересмотренное использование / вывод

$ ./bin/array_dyn_rand
Input Row size of the matrix: 5
Input Col size of the matrix: 5

Matrix A is of size 5 x 5

24      8       16      5       15
15      13      24      24      11
16      26      11      12      26
20      9       22      9       22
19      3       3       13      0

sum of the element of matrix is: 366
Diagonal sum is: 57

ПустьЯ знаю, если у вас есть дополнительные вопросы.

...