3 / 3 / 0
Регистрация: 18.12.2019
Сообщений: 238
1

сдвиг двумерного массива во всевозможные стороны

22.03.2020, 18:09. Показов 2800. Ответов 8
Метки нет (Все метки)

Как-то так, в общем.
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
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;
const int sizeROW = 100, sizeCOL = 100;
void PrintArray(int arr[][sizeCOL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << arr[i][j] << '\t';
        }
        cout << endl;
    }
}
void FillArray(int arr[][sizeCOL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            arr[i][j] = rand() % 100;
        }
    }
}
int main()
{
    SetConsoleOutputCP(1251);
    srand(time(0));
    int a[sizeROW][sizeCOL];
    int n = 2, m = 6;
    cout << "Исходный массив: " << endl;
    FillArray(a, n, m);
    PrintArray(a, n, m);
    cout << "Введите количество элементов на сдвиг: ";
    int number_of_shifts;
    cin >> number_of_shifts;
    cout << endl;
 
    cout << "Ввыберите положение (1-влево, 2-вправо, 3-вверх, 4-вниз): ";
    int position;
    cin >> position;
    int tmp;
    switch (position) {
    case 1:
    {
 
        PrintArray(a, n, m);
    }
    break;
    case 2:
    {
        for (size_t i = 0; i < n; i++)
        {
            for (size_t j = 0; j < m; j++)
            {
                tmp = a[i][m];
                for (size_t k = 0; k < m; k++)
                {
                    a[i][k + 1] = a[i][k];
                    a[i][k] = tmp;
                }
            }
        }
        PrintArray(a, n, m);
    }
    break;
    case 3:
    {
 
        PrintArray(a, n, m);
    }
    break;
    case 4:
    {
 
        PrintArray(a, n, m);
    }
    break;
    default: cout << "Позиций всего 4!";
    }
}
Что-то у меня не вяжется со сдвигом в правую сторону. Чет не могу сообразить что я делаю не так. Первый элемент затирает все последующие
Если что, в "подобном" исполнении нужны остальные сдвиги. Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2020, 18:09
Ответы с готовыми решениями:

Сдвиг массива в обе стороны
Доброе время суток... Помогите справиться с задачкой... Поясню, что хочу: 1) Как в массиве...

Сдвиг двумерного массива на n элементов
Друзья перепробовал все.. ответ близок.. делаю все for'ами, скидывать что я писал не буду потому...

Сдвиг столбца двумерного массива
Задача: Дан двумерный массив. а) Удалить из него k-ю строку. б) Удалить из него s-й столбец. ...

Сдвиг двумерного массива - java
Cпасибо всем, кто помог с решением прошлой задачи, сейчас порешал еще парочку и вот остановился на...

8
7420 / 5015 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
22.03.2020, 18:20 2
Лучший ответ Сообщение было отмечено atorvik как решение

Решение

циклический сдвиг матрицы направо:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void RightShift (double **a, int n, int m, int k)
{
    double temp;
    for (int p = 1; p <=k; p++)
    {
    for (int i = 0; i < n; i++)
    {    
    temp=a[i][m-1];
    for (int j = m-1; j > 0; j--)     
    a[i][j]=a[i][j-1];  
    a[i][0]=temp; 
    } 
    }
}
        
int main()
{
    srand((int)time(0));
    int n, m, k;
    cout << "n="; cin >> n;
    cout << "m="; cin >> m;
    
      double **a = new double*[n]; 
    for (int i = 0; i < n; i++)
       a[i]=new double[m];
    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
        a[i][j]=rand()%9 + 1;
        cout << a[i][j] << " ";
        }
    cout << "\n";
    }  
    
    cout << "Shift k="; cin >> k;    
    
    RightShift (a,n,m,k);
    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        cout << a[i][j] << " ";
    cout << "\n";
    }    
    
    for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
system("pause");
return 0;
}
1
3 / 3 / 0
Регистрация: 18.12.2019
Сообщений: 238
22.03.2020, 18:57  [ТС] 3
Yetty, а если delete убрать ? мы такое еще не проходили...

Добавлено через 57 секунд
Yetty, и что значит ** ? тоже не в курсе
0
7420 / 5015 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
22.03.2020, 19:32 4
atorvik,
C++
1
2
3
4
5
6
7
8
9
// объявление динамического массива
 double **a = new double*[n]; 
    for (int i = 0; i < n; i++)
       a[i]=new double[m];
......
// освобождение памяти
for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
Цитата Сообщение от atorvik Посмотреть сообщение
мы такое еще не проходили...
можете переделать предложенный код на статический массив или взять из кода содержимое функции RightShift для своего case 2:
1
3 / 3 / 0
Регистрация: 18.12.2019
Сообщений: 238
24.03.2020, 00:47  [ТС] 5
Yetty, есть идеи по поводу сдвига вверх/вниз ?
0
7420 / 5015 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
24.03.2020, 00:55 6
atorvik, циклический сдвиг матрицы на k позиций вниз:
C++
1
2
3
4
5
6
7
8
9
10
11
void DownShift (double **a, int n, int m, int k)
{
    double *temp;
    for (int p = 1; p <=k; p++)
    {
    temp=a[n-1];    
    for (int i = n-1; i > 0; i--)
    a[i]=a[i-1];  
    a[0]=temp; 
    }    
}
1
3 / 3 / 0
Регистрация: 18.12.2019
Сообщений: 238
24.03.2020, 21:47  [ТС] 7
Yetty, что я делаю не так ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void DownShift(int number_of_shifts, int arr[][sizeCOL], int row, int col)
{
    double temp;
    for (int p = 1; p <= number_of_shifts; p++)//кол-во сдвигов
    {
 
        for (int j = 0; j < col; j++)//колонка
        {
            temp = arr[row - 1][0];
            for (int i = row - 1; i > 0; i--)//ряд
            {
                arr[i][j] = arr[i - 1][j];
                arr[0][j] = temp;
            }
        }
 
    }
}
затирает числа
0
7420 / 5015 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
24.03.2020, 22:24 8
Лучший ответ Сообщение было отмечено atorvik как решение

Решение

atorvik, вообще-то выше я уже сбросил Вам блок который переставляет по строкам. если хотите по элементам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void DownShift (double **a, int n, int m, int k)
{
    double temp;
    for (int p = 1; p <=k; p++)
    {
        for (int j = 0; j < m; j++)
        {    
            temp=a[n-1][j];    
            for (int i = n-1; i > 0; i--)
            a[i][j]=a[i-1][j];  
            a[0][j]=temp; 
        } 
    }
}
1
3 / 3 / 0
Регистрация: 18.12.2019
Сообщений: 238
25.03.2020, 18:36  [ТС] 9
Итоговый вариант. Сдвиги во все стороны. Меню.
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
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;
const int sizeROW = 100, sizeCOL = 100;
void PrintArray(int arr[][sizeCOL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << arr[i][j] << '\t';
        }
        cout << endl;
    }
}
void FillArray(int arr[][sizeCOL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            arr[i][j] = rand() % 100;
        }
    }
}
void RightShift(int number_of_shifts, int arr[][sizeCOL], int row, int col)
{
    double temp;
    for (int p = 1; p <= number_of_shifts; p++)
    {
        for (int i = 0; i < row; i++)
        {
            temp = arr[i][col - 1];
            for (int j = col - 1; j > 0; j--)
                arr[i][j] = arr[i][j - 1];
            arr[i][0] = temp;
        }
    }
}
void LeftShift(int number_of_shifts, int arr[][sizeCOL], int row, int col)
{
    double temp;
    for (int i = 1; i <= number_of_shifts; i++)
    {
        for (int i = 0; i < row; i++)
        {
            temp = arr[i][col - col];
            for (int k = col - col; k < col; k++)
                arr[i][k] = arr[i][k + 1];
            arr[i][col - 1] = temp;
        }
    }
}
void DownShift(int number_of_shifts, int arr[][sizeCOL], int row, int col)
{
    double temp;
    for (int p = 1; p <= number_of_shifts; p++)
    {
        for (int j = 0; j < col; j++)
        {
            temp = arr[row - 1][j];
            for (int i = row - 1; i > 0; i--)
                arr[i][j] = arr[i - 1][j];
            arr[0][j] = temp;
        }
    }
}
void UpShift(int number_of_shifts, int arr[][sizeCOL], int row, int col)
{
    double temp;
    for (int p = 1; p <= number_of_shifts; p++)
    {
        for (int j = 0; j < col; j++)
        {
            temp = arr[row - row][j];
            for (int i = 0; i < row; i++)
                arr[i][j] = arr[i + 1][j];
            arr[row - 1][j] = temp;
        }
    }
}
int main()
{
    SetConsoleOutputCP(1251);
    srand(time(0));
    int a[sizeROW][sizeCOL];
    int n = 4, m = 6;
    cout << "Исходный массив: " << endl;
    FillArray(a, n, m);
    PrintArray(a, n, m);
    cout << "Введите количество элементов на сдвиг: ";
    int number_of_shifts;
    cin >> number_of_shifts;
    cout << endl;
    cout << "Ввыберите положение (1-влево, 2-вправо, 3-вверх, 4-вниз): ";
    int position;
    cin >> position;
    switch (position)
    {
    case 1:
    {
        LeftShift(number_of_shifts, a, n, m);
        PrintArray(a, n, m);
    }
    break;
    case 2:
    {
        RightShift(number_of_shifts, a, n, m);
        PrintArray(a, n, m);
    }
    break;
    case 3:
    {
        UpShift(number_of_shifts, a, n, m);
        PrintArray(a, n, m);
    }
    break;
    case 4:
    {
        DownShift(number_of_shifts, a, n, m);
        PrintArray(a, n, m);
    }
    break;
    default: cout << "Позиций всего 4!";
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2020, 18:36
Помогаю со студенческими работами здесь

Сдвиг двумерного массива влево
заполнить двумерный массив из N строк и N столбцов следующим образом: первая строка является...

Сдвиг элементов двумерного массива
Выполнить циклический сдвиг элементов двумерного массива на один вправо. Последний элемент строки...

Сдвиг элемента двумерного массива
Напишите программу циклической перестановки чисел заданного массива так, чтобы i -e число стало ( ...

Циклический сдвиг двумерного массива
Помогите, пожалуйста, с задачей. Необходимо выполнить циклический сдвиг двумерного массива....


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru