Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 27.05.2019
Сообщений: 7

Поворот неквадратной матрицы на 90° по часовой стрелке

29.05.2019, 21:55. Показов 4819. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу, выполняющую поворот неквадратной матрицы на 90° по часовой стрелке. Матрицы должны храниться в памяти в виде двумерного динамического массива, размерности исходной матрицы вводятся пользователем с клавиатуры. Предусмотреть генерацию значений матрицы как случайных целых чисел в диапазоне от -20 до 20.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.05.2019, 21:55
Ответы с готовыми решениями:

Поворот матрицы на 180 градусов по часовой стрелке
Нужна программа,которая повернет квадратную матрицу из N строк и N столбцов на 180 по часовой. программа на С++ За ранее благодарю:)

Произвести "поворот" матрицы по часовой стрелке
Задание: Задан квадратный массив А из N строк и N столбцов. Произвести «поворот по часовой стрелке» массива таким образом, чтобы элементы...

Поворот фигуры по часовой стрелке
Помогите вывести формулу для поворота фигуры на произвольный угол. У меня выходит одно уравнение с двумя неизвестными.

11
Just Do It!
 Аватар для XLAT
4204 / 2662 / 654
Регистрация: 23.09.2014
Сообщений: 9,045
Записей в блоге: 3
30.05.2019, 15:47
Цитата Сообщение от prorok1823 Посмотреть сообщение
Поворот неквадратной матрицы на 90° по часовой стрелке
брутальный вариант без компромиссов,
это когда мы полностью перевыделяем память для повернутого массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <iostream>
#include <iomanip>
 
///----------------------------------------------------------------------------|
/// Макросы для удобства.
///----------------------------------------------------------------------------:
#define SHOWVAL(v) std::cout << #v << " \t= "<< v << "\n"
#define FORi(n) for(int i = 0; i < n; ++i)
#define FORj(n) for(int j = 0; j < n; ++j)
#define PAUSE   std::cin.get()
 
///----------------------------------------------------------------------------|
/// Двумерный динамический массив инкапсулированный в структуре.
///----------------------------------------------------------------------------:
template<class T>
class carr
{
public:
    carr(int _r, int _c) : arr(NULL), row(_r), column(_c)
    {   arr = create_arr(row, column);
    }
    
   ~carr()
    {   delete_arr(arr);
    }
    
    //------------------------------------------------------resize(int r, int c)
    void resize(int _r, int _c)
    {   row    = _r;
        column = _c;
        if(arr != NULL) 
        {   delete_arr   (arr);
            create_arr(row, column);
        }
        
    }
    
    //-----------------------------------------------------------init_one(T val)
    void init_one(T _val)
    {   FORi(row)
            FORj(column)
                arr[i][j] = _val;
    }
    
    //--------------------------------------------------set(int r, int c, T val)
    void set(int _r, int _c, T _val)
    {   arr[_r][_c] = _val;
        *((T*)(arr + _r*column + _c)) = _val;
    }
    
    //---------------------------------------------------------get(int r, int c)
    T get(int _r, int _c)
    {   return arr[_r][_c];
        //return *((T*)(arr + _r*column + _c));
    }
 
    int row_()
    {   return row;
    }
    int column_()
    {   return column;
    }
    
    //-----------------------------------------------------------Вывод на экран:
    void show()
    {   //std::cout << "\n";
        SHOWVAL(row);
        SHOWVAL(column);
        FORi(row)
        {   FORj(column)
            {   std::cout << std::setw(5) 
                          << std::setprecision(4) 
                          << std::setfill(' ') << arr[i][j] << " \t";
            }
            std::cout << "\n";
        }
        std::cout << "\n";
    }
 
 
    //--------------------------------------------Вращение по часовой на 90гр..:
    void rot()
    {   T** temp = NULL;
        temp = create_arr(column, row);
        FORi(column)
        {   FORj(row)
            {   temp[i][j] = arr[row-j-1][i];
            }
        }
 
        delete_arr(arr);
        arr = temp;
        std::swap(row, column);
 
    }
 
    T* operator [](const int i)const {return arr[i];}
    
private:
    T** arr;
    
    int row, column;
    
    //--------------------------------------------------------------create_arr()
    T** create_arr(int r, int c)
    {   T** _arr;
        
        _arr = new T*[r];
        FORi(r)
        {   _arr[i] = new T[c];
        }
 
        return _arr;
    }
    
    //--------------------------------------------------------------delete_arr()
    void delete_arr(T**& p)
    {   FORi(row)
        {   delete[] p[i];
        }
        delete[] p;
        p = NULL;
    }
    
};
 
int rrand(int range_max, int range_min)
{   return rand() % (range_max - range_min + 1) + range_min;
}
 
template<class T>
T input_user(const char* promt, T& my)
{   std::cout << promt << " ";
 
    while(!(std::cin>>my) || std::cin.get() != '\n')
    {   std::cout<<"Incorrect input!\n";
        std::cin.clear();
        std::cin.sync();
    }
    return my;
}
    
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{
    setlocale(0, "");
 
    int col = input_user("Количество столбцов: ", col);
    int row = input_user("Количество рядов   : ", row);
 
    carr<int> matrix(row, col);
 
    std::cout << ///-----------------------------------------------------------|
        "///----------------------------------|\n" <<
        "/// Рандомно заполняем.              |\n" <<
        "///----------------------------------:\n";
    srand(static_cast<unsigned int>(time(NULL)));
    FORi(row)
    {   FORj(col)
        {   matrix[i][j] = rrand(20, -20);
        }
    }
    matrix.show();
 
    std::cout << ///-----------------------------------------------------------|
        "///----------------------------------|\n" <<
        "/// Заполняем числом следования.     |\n" <<
        "///----------------------------------:\n";
    int n = 0;
    FORi(row)
    {   FORj(col)
        {   matrix[i][j] = n++;
        }
    }
    matrix.show();
 
    std::cout <<
    "/// Крутонем массив на 90 градусов по часовой-------------------------:\n";
    matrix.rot();
    matrix.show();
 
    std::cout <<
    "/// Крутонем ещё раз(массив к верху ногами)---------------------------:\n";
    matrix.rot();
    matrix.show();
    
    PAUSE;
    return 0;
}
 
#undef FORi
#undef FORj
1
692 / 489 / 251
Регистрация: 10.06.2016
Сообщений: 2,337
30.05.2019, 16:01
XLAT, спрашиваю чисто из интереса. Какое прикладное значение может иметь такая задача?
0
Just Do It!
 Аватар для XLAT
4204 / 2662 / 654
Регистрация: 23.09.2014
Сообщений: 9,045
Записей в блоге: 3
30.05.2019, 16:29
Цитата Сообщение от slava_psk Посмотреть сообщение
Какое прикладное значение может иметь такая задача?
Когда сын крестьянина сломал ногу,
то один очень мудрый сосед спросил крестьянина, насмехаясь:
"Какое прикладное значение может иметь сломанная нога?".
Но когда началась война и сына крестьянина не взяли на войну,
"мудрый" сосед воскликнул:
"Однако, сломанная нога может иметь очень большое прикладное значение!",
стараясь шагать в ногу, чтобы не отстать от своих.
0
692 / 489 / 251
Регистрация: 10.06.2016
Сообщений: 2,337
30.05.2019, 18:41
Это не правильный ответ.
0
Just Do It!
 Аватар для XLAT
4204 / 2662 / 654
Регистрация: 23.09.2014
Сообщений: 9,045
Записей в блоге: 3
06.08.2019, 15:04
Цитата Сообщение от slava_psk Посмотреть сообщение
Это не правильный ответ.
пжлста, озвучьте правильный ответ ?!
0
692 / 489 / 251
Регистрация: 10.06.2016
Сообщений: 2,337
06.08.2019, 15:11
Бессмысленная задача, которую ни к чему привязать нельзя, пустые игры ума.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
06.08.2019, 15:38
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
inline int rand(int min, int max)
{
    return rand() % (max - min + 1) + min;
}
 
int main()
{
    // Для рандома
    srand(unsigned(std::time(0)));
    const int rand_min = -20;
    const int rand_max = 20;
 
    // Запрашиваем размер матрицы
    int rows;
    int columns;
 
    cout << "Matrix rows: "; cin >> rows;
    cout << "Matrix columns: "; cin >> columns;
 
    // Заполняем
    printf("Original matrix [%dx%d]:\n", rows, columns);
    int **matrix_rows = new int *[rows];
 
    for (int r = 0; r < rows; r++) {
        int *matrix_columns = new int[columns];
 
        for (int c = 0; c < columns; c++) {
            matrix_columns[c] = rand(rand_min, rand_max);
            printf("%d\t", matrix_columns[c]);
        }
 
        matrix_rows[r] = matrix_columns;
        printf("\n");
    }
 
    // Поворачиваем на 90
    int rows90 = columns;
    int columns90 = rows;
 
    printf("\nRotated matrix [%dx%d]:\n", rows90, columns90);
    int **matrix90_rows = new int *[columns];
 
    for (int r = 0; r < rows90; r++) {
        int *matrix90_columns = new int[columns90];
 
        for (int c = 0; c < columns90; c++) {
            matrix90_columns[c] = matrix_rows[c][r];
            printf("%d\t", matrix90_columns[c]);
            //printf("[%dx%d]\t", r, c);
        }
 
        matrix90_rows[r] = matrix90_columns;
        printf("\n");
    }
 
    // Освобождаем память
    for (int r = 0; r < rows; r++) {
        delete [] matrix_rows[r];
    }
    delete [] matrix_rows;
 
    for (int r = 0; r < rows90; r++) {
        delete [] matrix90_rows[r];
    }
    delete [] matrix90_rows;
 
    return 0;
}
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
06.08.2019, 15:49
Цитата Сообщение от slava_psk Посмотреть сообщение
Какое прикладное значение может иметь такая задача?
Какое прикладное значение имеет пропихивание фигурок в дырки?
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.11.2020, 12:00
XLAT, https://www.youtube.com/watch?... azevAndrey
1
692 / 489 / 251
Регистрация: 10.06.2016
Сообщений: 2,337
24.11.2020, 12:41
WxMaper, с дырками все понятно - развитие у ребенка геометрического мышления. Очень полезная игрушка.
0
Just Do It!
 Аватар для XLAT
4204 / 2662 / 654
Регистрация: 23.09.2014
Сообщений: 9,045
Записей в блоге: 3
28.04.2021, 13:42
Цитата Сообщение от slava_psk Посмотреть сообщение
Бессмысленная задача, которую ни к чему привязать нельзя, пустые игры ума.
соболезную вашей блокировке

Использование матричных поворотов(в "брутальном" стиле) в алгоритме генерации кроссворда.
https://www.cyberforum.ru/post15453880.html

В чём бонус?
В скорости написания такой программы за счёт подобно-схожих кусков кода, а-ля, "копипаста форева!"...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2021, 13:42
Помогаю со студенческими работами здесь

Поворот массива на 90 градусов по часовой стрелке
Всем привет! Помогите найти ошибку, программа должна поворачивать целочисленный массив на 90 градусов по часовой стрелке Пример 1 2 3 ...

Заполнение матрицы по спирали (из центра по часовой стрелке)
Пользователь должен ввести размерность матрици!Матрица квадратная!А программа должна заполнить её числами по порядку 1 2 3 4 5 .... (из...

Преобразование матрицы в одномерный массив по часовой стрелке
Преобразование матрицы в одномерный массив по часовой стрелке в C++. К примеру: 4 5 7 3 6 8 9 2 1 4 5 7 8 1 2 9 3 6

Содержимое матрицы повернуть на 90 градусов по часовой стрелке
Двухмерный массив из 3 строк и 3 столбцов заполнить числовыми значениями.Содержимое массива повернуть на 90 градусов по часовой стрелке.

Содержимое матрицы размерности n x n повернуть на 90 по часовой стрелке вокруг центра симметрии матрицы. Исходная матрица вводится из файла
Help me plz


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru