Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
_ALLEN_
3 / 3 / 0
Регистрация: 19.02.2010
Сообщений: 30
02.05.2010, 19:03     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы #1
2. Дана матрица порядка MxN (M строк, N столбцов). Необходимо заполнить ее значениями и написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2010, 19:03     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы
Посмотрите здесь:

Циклический сдвиг столбцов C++
C++ Циклический сдвиг матрицы
C++ Циклический сдвиг матрицы
C++ Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа сдвигов
C++ В квадратной матрице выполнить циклический сдвиг строк
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
madfax
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 15
03.07.2016, 12:00     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы #2
".. написать функцию" упустил из виду
стопэ, так это же 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);
 
    }
}
Миниатюры
Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы  
N0t2Day
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 2
24.09.2016, 10:29     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы #3
Как сделать проверку на то что б пользователь не выше за приделы массива???
Прошу прощения не знаю как оформить правильно, первый раз у вас!
Дана матрица порядка 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;
 
 
}
obivan
Падаван С++
 Аватар для obivan
172 / 158 / 41
Регистрация: 11.11.2014
Сообщений: 600
Завершенные тесты: 1
24.09.2016, 11:57     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы #4
Цитата Сообщение от N0t2Day Посмотреть сообщение
Как сделать проверку на то что б пользователь не выше за приделы массива
Самый лучший способ, не выходить за пределы А по теме немножко непонятно что вы имели ввиду, если в цикле ну тогда срвнивайте с константами размеров, а если вы вводите индексы и допустим проверки хотите сделать чтобы число в диапазоне было то как то так
C++
1
2
3
4
5
int index = 0;
cin >> index;
if(index >= 0 && index < size) {
    //...
}
N0t2Day
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 2
24.09.2016, 13:02     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы #5
Ну например массив 10 на 7 пользователь выбрал строку №2 и хочет сместить ее на 3 позиции в верх, он таким образов попытается выйти за придел массива...как быть?
obivan
Падаван С++
 Аватар для obivan
172 / 158 / 41
Регистрация: 11.11.2014
Сообщений: 600
Завершенные тесты: 1
27.09.2016, 07:06     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы #6
N0t2Day, В этом случае вам нужно обменивать первую строку с последней и двигать остальные на 1 вверх, это и есть циклический сдвиг
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2016, 17:30     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы
Еще ссылки по теме:

Выполнить циклический сдвиг массива на заданное количество столбцов C++
C++ Динамические массивы,циклический сдвиг столбцов массива
C++ Выполнить циклический сдвиг двумерного массива на заданное количество столбцов

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

Или воспользуйтесь поиском по форуму:
VaLc_DD
0 / 0 / 0
Регистрация: 17.06.2016
Сообщений: 13
04.11.2016, 17:30     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы #7
Кто может подскажите в чем проблема, вместо свича использовать надо указатель на функции, и по отдельности функции работают, а когда запускаю через указатель тот ошибка на стадии выполнения.
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 минут
спасибо, за ответы)) уже разобрался
Yandex
Объявления
04.11.2016, 17:30     Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы
Ответ Создать тему
Опции темы

Текущее время: 12:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru