Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
38 / 27 / 13
Регистрация: 18.12.2019
Сообщений: 423
Записей в блоге: 1

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

22.03.2020, 18:09. Показов 3302. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2020, 18:09
Ответы с готовыми решениями:

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

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

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

8
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
22.03.2020, 18:20
Лучший ответ Сообщение было отмечено 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
38 / 27 / 13
Регистрация: 18.12.2019
Сообщений: 423
Записей в блоге: 1
22.03.2020, 18:57  [ТС]
Yetty, а если delete убрать ? мы такое еще не проходили...

Добавлено через 57 секунд
Yetty, и что значит ** ? тоже не в курсе
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
22.03.2020, 19:32
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
38 / 27 / 13
Регистрация: 18.12.2019
Сообщений: 423
Записей в блоге: 1
24.03.2020, 00:47  [ТС]
Yetty, есть идеи по поводу сдвига вверх/вниз ?
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.03.2020, 00:55
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
38 / 27 / 13
Регистрация: 18.12.2019
Сообщений: 423
Записей в блоге: 1
24.03.2020, 21:47  [ТС]
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
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.03.2020, 22:24
Лучший ответ Сообщение было отмечено 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
38 / 27 / 13
Регистрация: 18.12.2019
Сообщений: 423
Записей в блоге: 1
25.03.2020, 18:36  [ТС]
Итоговый вариант. Сдвиги во все стороны. Меню.
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2020, 18:36
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
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