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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
_ALLEN_
3 / 3 / 0
Регистрация: 19.02.2010
Сообщений: 30
#1

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

02.05.2010, 19:03. Просмотров 1910. Ответов 6
Метки нет (Все метки)

2. Дана матрица порядка MxN (M строк, N столбцов). Необходимо заполнить ее значениями и написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2010, 19:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написать функцию, осуществляющую циклический сдвиг строк и/или столбцов заданной матрицы (C++):

Циклический сдвиг столбцов - C++
Добрый день!!! Подскажите, пожалуйста, где у меня ошибка в программу. Программа реализует циклический сдвиг столбцов массива...

Динамические массивы,циклический сдвиг столбцов массива - C++
Здравствуйте, Нужно сдвинуть столбцы динамической матрицы циклически вправо, у меня почему то ошибка, подскажите пожалуйста в чем...

Выполнить циклический сдвиг массива на заданное количество столбцов - C++
Дан двумерный массив размерностью N x M, заполненный случайными числами из диапазона от 0 до 100. Выполнить циклический сдвиг массива на...

Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа сдвигов - C++
Дана целочисленная матрица размерности n x m. Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа...

Выполнить циклический сдвиг двумерного массива на заданное количество столбцов - C++
Дан двумерный массив размерностью N x M, заполненный случайными числами из диапазона от 0 до 100. Выполнить циклический сдвиг массива на...

Найти сумму всех строк и столбцов заданной матрицы - C++
Задание: Дан двумерный массив, нужно подсчитать сумму всех строк и столбцов.Спасибо.

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

В заданной строке выполнить циклический сдвиг на указанное число позиций - C++
Строка символов состоит из произвольных десятичных цифр в пределах от 1 до 9, разделенных пробелами. Если первое число четное, то выполнить...

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

Циклический сдвиг матрицы - C++
Есть динамическая матрица, и есть обычный сдвиг на N элементов на право. как сделать сдвиг по рисунку? #include &lt;stdlib.h&gt; #include...

Циклический сдвиг матрицы - C++
Всем доброго дня. Программа располагает двумерный массив в динамичной памяти и сдвигает его на Т элементов влево. вопрос вот в чем: Как...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.11.2016, 17:30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru