Вывод матрицы спиралью [закрыт]

90
24 декабря 2021, 06:30
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 2 года назад.

Улучшить вопрос

Задача заключается в выводе матрицы (через функции) спиралью, начиная с верхнего правого угла против часовой стрелки, т.е.

Но написанный мною код даже не запускается. Завершается работа (после ввода размеров матрицы) приложения .ехе, которое создаётся при запуске программы.

#include<iostream>
using namespace std;
//---------------------------------
int **Create(int row, int col);        // создание матрицы 
void Free(int **M, int row);         // освобождение матрицы
void Print(int **M, int row, int col); //вывод матрицы
//---------------------------------
void Work(int **M, int row, int col); //заполнение матрицы
//---------------------------------
int main()
{
    setlocale(LC_ALL,"Rus");
    int matrixSize;
    cout << "Введите размер квадратной матрицы: ";
    cin >> matrixSize;
    int **A = Create(matrixSize, matrixSize);
    Work(A, matrixSize, matrixSize);
    Print(A, matrixSize, matrixSize);
    Free(A, matrixSize);
    return 0;
}
//----------------------------------
int **Create(int row, int col)
{
    int **M = new int *[row];
    for (int i = 0; i < row; i++) {
        M[i] = new int[col];
    }
    return M;
}
//---------------------------------
void Free(int **M, int row)
{
    for (int i = 0; i < row; i++)
        delete[] M[i];
    delete[] M;
}
//----------------------------
void Print(int **M, int row, int col)
{
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            cout << M[i][j] << " ";
        }
        cout << endl;
    }
}
//---------------------------------------------
void Work(int **M, int row, int col)
{
    int value = 1, j;
    int p = col / 2;
    for (int k = 1; k <= p; k++)//цикл по номеру витка
    {
        for (j = col - k + 1; j > k - 1; j--) M[k - 1][j] = value++; //top right-to-left    
        for (j = k - 1; j < col - k + 1; j++) M[j][k - 1] = value++;//left top-to-bottom
        for (j = k - 1; j < col - k + 1; j++) M[col - k][j] = value++;//bottom left-to-right
        for (j = col - k + 1; j >= k; j--) M[j][col - k] = value++;//right bottom-to-top
    }
    if (col % 2 == 1) M[p][p] = col * col;
}

Помогите разобраться пожалуйста!

Answer 1

В функции Work

for (int k = 1; k <= p; k++)
{
  for (j = col - k + 1; j > k - 1; j--) M[k - 1][j] = value++;
  ...
  for (j = col - k + 1; j >= k; j--) M[j][col - k] = value++;
}

При k = 1 будет j = col - k + 1 = col. То есть в первом цикле вы сразу лезете в M[0][col], а в последнем - в M[col][col - 1]. А это, разумеется, вылеты за пределы массива.

READ ALSO
C++, использование char для доступа к элементам массива

C++, использование char для доступа к элементам массива

Я хочу уточнить один момент, касающийся использования char для доступа к элементам массива

253
Работа со строками (string) в С++

Работа со строками (string) в С++

Подскажите как можно сделать сие действие:

188
Работа с valarray и струкутрами

Работа с valarray и струкутрами

Есть некоторая структура

176
Поиск подстроки в std::vector&lt;string&gt;

Поиск подстроки в std::vector<string>

Подскажите как решить следующую задачу оптимальным путем:

129