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

Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы

02.05.2010, 19:03. Показов 17188. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
2. Дана матрица порядка MxN (M строк, N столбцов). Необходимо заполнить ее значениями и написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2010, 19:03
Ответы с готовыми решениями:

Написать функцию, осуществляющую перемену местами столбцов вещественной матрицы
Написать функцию SwapCol(A, M, N, K1, K2), осуществляющую перемену местами столбцов вещественной матрицы A размера M × N с номерами K1...

Описать процедуру, осуществляющую циклический сдвиг элементов матрицы
Здраствуйте Уважаемые форумчане при введении процедуры в программу, я столкнулся с проблемой, не знаю какие действия можно вставить в...

Написать программу осуществляющую циклический сдвиг элементов массива вправо на одну позицию
Две массив размера. Написать программу,осуществляющую циклический сдвиг элементов массива вправо на одну позицию. Нарисовать блок-схему к...

8
2 / 2 / 2
Регистрация: 05.06.2016
Сообщений: 15
03.07.2016, 12:00
".. написать функцию" упустил из виду
стопэ, так это же main() :\

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
#include <iostream>
 
using::std::endl;
using::std::cout;
using::std::cin;
 
void ask(int, int, char &, int &);
void show(int **, int, int);
void r_up(int **, int, int);
void r_dn(int **, int, int);
void c_lt(int **, int, int);
void c_rt(int **, int, int);
 
void main(){
 
    int R = 3, C = 3;
    int **ar = new int*[R];
    ar[0] = new int[C]{1, 1, 3};
    ar[1] = new int[C]{1, 2, 2};
    ar[2] = new int[C]{3, 2, 3};
 
    show(ar, R, C);
 
    void(*pf)(int**, int, int) = show;
    char action;
    int pos;
 
    ask(R, C, action, pos);
 
    switch (action)
    {
    case'r':
        pf = c_rt;
        break;
    case'l':
        pf = c_lt;
        break;
    case'u':
        pf = r_up;
        break;
    case'd':
        pf = r_dn;
        break;
    }
 
    for (int i = 0; i < pos; i++)
    {
        pf(ar, R, C);
    }
 
    show(ar, R, C);
 
    for (int i = 0; i < R; i++) delete[] ar[i];
    delete[] ar;
}
 
void show(int **a, int r, int c){
 
    for (int i = 0; i < r; i++){
        cout << endl;
 
        for (int j = 0; j < c; j++)
            cout << a[i][j] << "\t";
    }
 
    cout << "\n\n";
}
 
void r_up(int **ar, int R, int C){
 
    int *tmp = new int[C];
 
    for (int j = 0; j < C; j++)
        tmp[j] = ar[0][j];
 
    for (int i = 0; i < R - 1; i++)
    for (int j = 0; j < C; j++)
        ar[i][j] = ar[i + 1][j];
 
    for (int j = 0; j < C; j++)
        ar[R - 1][j] = tmp[j];
 
    delete[] tmp;
}
 
 
void r_dn(int **ar, int R, int C){
 
    int *tmp = new int[C];
 
    for (int j = 0; j < C; j++)
        tmp[j] = ar[R - 1][j];
 
    for (int i = R - 1; i > 0; i--)
    for (int j = 0; j < C; j++)
        ar[i][j] = ar[i - 1][j];
 
    for (int j = 0; j < C; j++)
        ar[0][j] = tmp[j];
 
    delete[] tmp;
}
 
void c_lt(int **ar, int R, int C){
 
    int *tmp = new int[R];
 
    for (int i = 0; i < R; i++)
        tmp[i] = ar[i][0];
 
    for (int i = 0; i < R; i++)
    for (int j = 0; j < C - 1; j++)
        ar[i][j] = ar[i][j + 1];
 
    for (int i = 0; i < R; i++)
        ar[i][C - 1] = tmp[i];
 
    delete[] tmp;
}
 
void c_rt(int **ar, int R, int C){
 
    int *tmp = new int[R];
 
    for (int i = 0; i < R; i++)
        tmp[i] = ar[i][C - 1];
 
    for (int i = 0; i < R; i++)
    for (int j = C - 1; j > 0; j--)
        ar[i][j] = ar[i][j - 1];
 
    for (int i = 0; i < R; i++)
        ar[i][0] = tmp[i];
 
    delete[] tmp;
}
 
void ask(int C, int R, char &answer, int &p){
 
    do{
        cout << " right shift [ r ]  left [ l ]  up [ u ]  down [ d ]  : ";
        cin >> answer;
    } while (answer != 'r' && answer != 'l' && answer != 'u' && answer != 'd');
 
 
    if (answer == 'u' || answer == 'd'){
 
        do{
            cout << "\n will shift by [ 1 to R ] pos  : ";
            cin >> p;
        } while (p < 1 || p > R);
 
    }
    else{
 
        do{
            cout << "\n will shift by [ 1 to C ] pos  : ";
            cin >> p;
        } while (p < 1 || p > C);
 
    }
}
Миниатюры
Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы  
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 2
24.09.2016, 10:29
Как сделать проверку на то что б пользователь не выше за приделы массива???
Прошу прощения не знаю как оформить правильно, первый раз у вас!
Дана матрица порядка MxN (M строк, N столбцов).
Необходимо заполнить ее значениями и написать функ-
цию, осуществляющую циклический сдвиг строк и/или
столбцов массива указанное количество раз и в указан-
ную сторону.
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
#include <iostream>
#include <iomanip>
#include <time.h>
#include <Windows.h>
#include <math.h>
#include <stdio.h>
using namespace std;
 
enum ConsoleColor {
    Black, Blue, Green, Cyan, Red, Magenta, Brown, LightGray, DarkGray,
    Lightblue, LightGreen, Lightcyan, lightRed, LightMagenta, Yellow, White
};
void SetColor(int text, int background)
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
void GotoXY(int X, int Y)
{
    HANDLE  hConsole;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = { X, Y };
    SetConsoleCursorPosition(hStdOut, coord);
}
void show_ar(int *ar[], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << ' ' << setw(2) << ar[i][j];
        }
        cout << endl;
    }
}
int sdvig_ar(int *ar[], int row, int col, int choose)
{
    if (choose <= 0)
    {
        cout << "Введите номер строки которую будем сдвигать от 1 до " << row << ": ";
        int nomer_str;
        cin >> nomer_str;
        short a = nomer_str-1;
        if ( a < 0 || a > row)
        {
            cout << "Ошибка выбора строки" << endl;
            exit(0);
        }
        cout << "Куда будем сдвигать? Если вверх - 0, если в низ - 1." << endl;
        int vibor_sdviga;
        cin >> vibor_sdviga;
        cout << "Сколько сдвигов будем делать?" << endl;
        int kol_sdvigov;
        cin >> kol_sdvigov;
        for (int i = 0; i < kol_sdvigov; i++)
        {
            if (vibor_sdviga < 0 || vibor_sdviga > 1)
            {
                cout << "Ошибка выбора действия" << endl;
                exit(0);
            }
            if (vibor_sdviga == 0)
            {
                swap(ar[a - 1], ar[a]);
            }
 
            if (vibor_sdviga == 1)
            {
                swap(ar[a + 1], ar[a]);
            }
            a--;
        }
    }
}
void main()
{
    srand(time(NULL));
    //setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int row = 10;
    int col = 7;
    int **ar = new int *[row];
    int k = 10; // Заполним масив последовательными числами
    for (int i = 0; i < row; i++)
    {
        ar[i] = new int[col];
    }
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            ar[i][j] = k;
            k++;
        }
    }
    show_ar(ar, row, col);
    cout << endl;
    cout << "Что будем сдвигать? Если строку - 0, если столбец - 1.";
    cout << endl;
    int choose;
    cin >> choose;
    sdvig_ar(ar, row, col, choose);
    cout << endl;
    show_ar(ar, row, col);
    cout << endl;
 
 
}
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
24.09.2016, 11:57
Цитата Сообщение от N0t2Day Посмотреть сообщение
Как сделать проверку на то что б пользователь не выше за приделы массива
Самый лучший способ, не выходить за пределы А по теме немножко непонятно что вы имели ввиду, если в цикле ну тогда срвнивайте с константами размеров, а если вы вводите индексы и допустим проверки хотите сделать чтобы число в диапазоне было то как то так
C++
1
2
3
4
5
int index = 0;
cin >> index;
if(index >= 0 && index < size) {
    //...
}
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 2
24.09.2016, 13:02
Ну например массив 10 на 7 пользователь выбрал строку №2 и хочет сместить ее на 3 позиции в верх, он таким образов попытается выйти за придел массива...как быть?
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
27.09.2016, 07:06
N0t2Day, В этом случае вам нужно обменивать первую строку с последней и двигать остальные на 1 вверх, это и есть циклический сдвиг
2
0 / 0 / 0
Регистрация: 17.06.2016
Сообщений: 36
04.11.2016, 17:30
Кто может подскажите в чем проблема, вместо свича использовать надо указатель на функции, и по отдельности функции работают, а когда запускаю через указатель тот ошибка на стадии выполнения.
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
/*Задание 3:
Дана матрица порядка MxN (M строк, N столбцов). Необходимо заполнить ее значениями и написать функцию,
осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.*/
 
 
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
 
 
 
void st_left(int **mas, int M, int N, int kol){
    cout << "\tCдвиг столбцов влево на\t" << kol << "\n\n";
    if (kol>N)kol = kol%N;
    for (int i = 0; i < M; i++){
        for (int j = 0, c = 0, g = kol; j < N; g++, j++){
            if (g < N)  cout << mas[i][g] << "\t";
            else {
                cout << mas[i][c] << "\t";
                c++;
            }
        }
        cout << "\n";
    }
}
 
void st_right(int **mas, int M, int N, int kol){
    cout << "\tCдвиг столбцов вправо на\t" << kol << "\n\n";
    if (kol>N)kol = kol%N;
    for (int i = 0; i < M; i++){
        for (int j = 0, c = 0, g = kol; j < N; g--, j++){
            if (g > 0)  cout << mas[i][N - g] << "\t";
            else {
                cout << mas[i][c] << "\t";
                c++;
            }
        }
        cout << "\n";
    }
}
 
void str_up(int **mas, int M, int N, int kol){
    cout << "\tCдвиг строк вверх на\t" << kol << "\n\n";
    if (kol>M) kol = kol%M;
    for (int i = 0, g = kol; i < M; g++, i++){
        for (int j = 0; j < N; j++){
            if (g < M)  cout << mas[g][j] << "\t";
            else cout << mas[g - M][j] << "\t";
        }
        cout << "\n";
    }
}
 
void str_down(int **mas, int M, int N, int kol){
    cout << "\tCдвиг строк вниз на\t" << kol << "\n\n";
    if (kol>M) kol = kol%M;
    for (int i = 0, g = kol; i < M; g--, i++){
        for (int j = 0; j < N; j++){
            if (g > 0)  cout << mas[M - g][j] << "\t";
            else cout << mas[-g][j] << "\t";
        }
        cout << "\n";
    }
}
 
int ** Sozdanie(int M, int N)
{
    int **mas = (int**)malloc(M*sizeof(int*));
    for (int i = 0; i < M; i++){
        mas[i] = (int*)malloc(N*sizeof(int));
    }
    return mas;
}
 
void zapoln(int **mas, int M, int N){
    for (int i = 0; i < M; i++){
        for (int j = 0; j < N; j++){
            mas[i][j] = rand() % 33;
        }
    }
}
 
void print(int **mas, int M, int N){
    for (int i = 0; i < M; i++){
        for (int j = 0; j < N; j++){
            cout << mas[i][j] << "\t";
        }
        cout << "\n";
    }
}
void main(){
    setlocale(LC_ALL, "rus");
    srand(time(NULL));
    int M, N, kol, sdvig;
    cout << "\nВведите количество строк\t";
    cin >> M;
    cout << "\nВведите количество столбцов\t";
    cin >> N;
 
    do{
        system("CLS");
        int **mas = Sozdanie(M, N);
        zapoln(mas, M, N);
        print(mas, M, N);
        cout << "\nВведите количество сдвигов\t";
        cin >> kol;
        cout << "\n";
        cout << "\n\nВыберите как вы хотите сдвинуть массив\n\n";
        cout << "1\tсдвиг столбцов влево\n";
        cout << "2\tсдвиг столбцов вправо\n";
        cout << "3\tсдвиг строк вверх\n";
        cout << "4\tсдвиг строк вниз\n";
        cout << "ESC\tдля выхода\n";
        void(*p_func[4])(int **, int, int, int) = { st_left, st_right, str_up, str_down };
        sdvig = getch();
 
        p_func[sdvig - 1](mas, M, N, kol);      // проблема тут или в 115 строке, не пойму почему не вызывается функция, и не выводится на печать, по отдельности все работает.
        system("pause");
        for (int i = 0; i < M; i++)
            free(mas[i]);
        free(mas);
    } while (sdvig != 27);
 
 
}
понимаю, что громоздко слишком, но главный вопрос почему не работает именно. По идее ошибка в районе строки 115, но в чем она понять не могу((

Добавлено через 4 часа 36 минут
спасибо, за ответы)) уже разобрался
0
0 / 0 / 0
Регистрация: 27.07.2020
Сообщений: 1
19.10.2020, 15:26
Вот еще примерчик:
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
195
196
197
198
199
200
201
202
203
204
/*
    Дана  матрица  порядка  MxN  (M  строк,  N  столбцов).
    Необходимо  заполнить  ее  значениями  и написать  функцию,
    осуществляющую  циклический  сдвиг  строк  и/или  столбцов  массива
    указанное количество раз и в указанную сторону.
*/
 
#include <iostream>
#include <iomanip>
#include <time.h>
 
using namespace std;
 
int** Create2D(int n, int m)
{
    int** mas = (int**)calloc(n, sizeof(int*));
    for (int i = 0; i < n; i++)
    {
        mas[i] = (int*)calloc(m, sizeof(int));
    }
    return mas;
}
 
void Delete2D(int** mas, int n)
{
    for (int i = 0; i < n; i++)
    {
        free(mas[i]);
    }
    free(mas);
}
 
void InitArray(int** mas, int n, int m)
{
    for (int i = 0, k = 1; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            mas[i][j] = k;//*(*(mas+i)+j)
            k++;
        }
        k = k + 1 - m;
    }
}
 
void ShowArray(int** mas, int n, int m)
{
    cout << "\n";
    int h = 5 * m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << setw(4) << mas[i][j] << "|";
        }
        cout << "\n";
        for (int i = 0; i < h; i++)
        {
            cout << '-';
        }
        cout << "\n";
    }
    cout << "\n";
}
 
void ShiftArray(int** mas, int n, int m, char direc, short shift)
{
    int** arr = Create2D(n, m);
    switch (direc)
    {
        /* Если сдвиг влево */
    case 'l':
 
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if ((shift + j - m) < 0)
                {
                    arr[i][j] = mas[i][j + shift];
                }
                else
                {
                    arr[i][j] = mas[i][shift + j - m];
                }
            }
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                mas[i][j] = arr[i][j];
            }
        }
        Delete2D(arr, n);
        break;
        /* Если сдвиг вправо */
    case 'r':
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (m - shift + j > m - 1)
                {
                    arr[i][j] = mas[i][j - shift];
                }
                else
                {
                    arr[i][j] = mas[i][m - shift + j];
                }
            }
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                mas[i][j] = arr[i][j];
            }
        }
        Delete2D(arr, n);
        break;
        /* Если сдвиг вниз */
    case 'd':
        for (int j = 0; j < n; j++)
        {
            for (int i = 0; i < m; i++)
            {
                if (n - shift + i > n - 1)
                {
                    arr[i][j] = mas[i - shift][j];
                }
                else
                {
                    arr[i][j] = mas[n - shift + i][j];
                }
            }
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                mas[i][j] = arr[i][j];
            }
        }
        Delete2D(arr, n);
        break;
        /* Если сдвиг вверх */
    case 'u':
        for (int j = 0; j < n; j++)
        {
            for (int i = 0; i < m; i++)
            {
                if (shift + i - n < 0)
                {
                    arr[i][j] = mas[i + shift][j];
                }
                else
                {
                    arr[i][j] = mas[shift + i - n][j];
                }
            }
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                mas[i][j] = arr[i][j];
            }
        }
        Delete2D(arr, n);
    default:
        break;
    }
}
 
int main()
{
    srand(time(0));
    int row, column;
    int** mas;
    cout << "Enter the number of lines => ";
    cin >> row;
    cout << "Enter the number of columns => ";
    cin >> column;
    mas = Create2D(row, column);
    InitArray(mas, row, column);
    cout << "\nOriginal array:\n";
    ShowArray(mas, row, column);
    cout << "Rows = " << row << "\nColumns = " << column << "\n\n";
    char ch;// верх, низ, лево, право
    short sh;// кол-во сдвигов
    cout << "Enter the number of shifts -> ";
    cin >> sh;
    cout << "Enter the direction of the shift:\n";
    cout << "l - to the left;\n"
        "r - to the right;\n"
        "u - up;\n"
        "d - down.\n";
    cin >> ch;
    ShiftArray(mas, row, column, ch, sh);
    ShowArray(mas, row, column);
    Delete2D(mas, row);
    return 0;
}
0
0 / 0 / 0
Регистрация: 13.12.2022
Сообщений: 2
09.04.2023, 22:00
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
#include <iostream>
 
    //размер массива
    const int rows = 4;
    const int cols = 4;
 
void shiftRows(int** arr, int row, int shifts) {
 
    int* temp = new int[cols];
    for (int k = 0; k < shifts; k++) 
    {
        // сохраняем первый элемент строки
        int first = arr[row][0];
        
        // сдвигаем оставшиеся элементы влево на один
        for (int i = 1; i < cols; i++) {
            temp[i - 1] = arr[row][i];
        }
        
        // помещаем первый элемент в конец строки
        temp[cols - 1] = first;
        
        // копируем временный массив в матрицу
        for (int i = 0; i < cols; i++) {
            arr[row][i] = temp[i];
        }
    }
    delete[] temp;
}
 
void shiftCols(int** arr, int col, int shifts) {
 
    int* temp = new int[rows];
    for (int k = 0; k < shifts; k++) {
 
        // сохраняем первый элемент столбца
        int first = arr[0][col];
 
        // сдвигаем оставшиеся элементы вверх на один
        for (int i = 1; i < rows; i++) {
            temp[i - 1] = arr[i][col];
        }
 
        // помещаем первый элемент в конец столбца
        temp[rows - 1] = first;
 
        // копируем временный массив в матрицу
        for (int i = 0; i < rows; i++) {
            arr[i][col] = temp[i];
        }
    }
    delete[] temp;
}
 
void shiftArray(int** arr, int direction, int shifts) {
    switch (direction) {
    case 1: // up
        for (int i = 0; i < cols; i++) {
            shiftCols(arr, i, shifts);
        }
        break;
    case 2: // down
        for (int i = 0; i < cols; i++) {
            shiftCols(arr, i, rows - shifts);
        }
        break;
    case 3: // left
        for (int i = 0; i < rows; i++) {
            shiftRows(arr, i, shifts);
        }
        break;
    case 4: // right
        for (int i = 0; i < rows; i++) {
            shiftRows(arr, i, cols - shifts);
        }
        break;
    default:
        std::cout << "Invalid direction.\n";
        break;
    }
}
 
void fillArray(int** arr, int rows, int cols) {
    int counter = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            arr[i][j] = counter++;
        }
    }
}
 
void printArray(int** arr, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if(arr[i][j] < 10)
            { 
            std::cout << " " << arr[i][j] << " ";
            }
            else if (arr[i][j] > 9)
            {
                std::cout << " " << arr[i][j];
            }
        }
        std::cout << "\n";
    }
    std::cout << "\n\n";
}
int main()
{
    int Direction{};
    int shifts{};
 
    //инициализирую двумерный массив
    int** array = new int* [rows];
    for (int i = 0; i < rows; i++)
    {
        array[i] = new int[cols];
    }
    //заполняю значениями от 0 до rows * cols - 1
    fillArray(array, rows, cols);
    printArray(array, rows, cols);
 
    std::cout << " 1 - up\n 2 - down\n 3 - left\n 4 - right\n\n"
              << " Enter direction: ";
    std::cin >> Direction;
 
    std::cout << " Enter shifts: ";
    std::cin >> shifts;
    std::cout << "\n";
 
    shiftArray(array, Direction, shifts);
    printArray(array, rows, cols);
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.04.2023, 22:00
Помогаю со студенческими работами здесь

Циклический сдвиг столбцов матрицы
Задана цілочислова матриця A(n,n), n&gt;20 . Розробити програму, яка здійснює циклічний зсув стовпців так, щоб першим став стовпчик, у якому...

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

Циклический сдвиг столбцов матрицы
10. Дана матрица А, выполнить циклический сдвиг всех ее столбцов, начиная со второго, так, чтобы максимальный элемент каждого столбца...

Выполнить циклический сдвиг столбцов матрицы
Здравствуйте, помогите, пожалуйста, написать эту программу: Динамически выделить память под N*M элементов вещественного типа float....

Описать процедуру,осуществляющую циклический сдвиг элементов массива на k позиций
Описать процедуру MoveLeft(A,N,k)1|MoveRight(A,N,k)2, осуществляющую циклический сдвиг элементов вещественного массива A размера N на k...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru