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

Сдвинуть в каждом столбце циклически все элементы массива

04.06.2015, 07:39. Показов 2482. Ответов 3
Метки нет (Все метки)

Дан вещественный массив А[N][M] и целое число 0<k<N. Сдвинуть в каждом столбце циклически все элементы массива на k позиций вниз.

Как сделать этот самый сдвиг на k позиций вниз? Половина программы написана
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <locale.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus");
    int n, m, k, i, j;
    cout << "n=";  cin >> n;
    cout << "m=";  cin >> m;
 
    float **a = new float *[n];
    for (int i = 0; i<n; i++)
    {
        a[i] = new float[m];
    }
 
    cout << "Введите массив A \n";
    for (i = 0; i<n; i++)
    for (j = 0; j<m; j++)
        cin >> a[i][j];
 
    cout << "Массив A \n";
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<m; j++)
            cout << a[i][j] << "\t"; cout << endl;
    }
 
    cout << "\nВведите целое число 0<k<" << n << " \n ";
    cin >> k;
 
    while (k>n )
    {
        cout << "Неверное значение k! введите целое число 0<k<" << n << "\n ";
        cin >> k;
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2015, 07:39
Ответы с готовыми решениями:

Все элементы массива X(30) циклически сдвинуть на n позиций влево
Все элементы массива X(30) циклически сдвинуть на n позиций влево при помощи указателей

Удалить все нечетные элементы массива. Добавить элемент с номером К. Сдвинуть циклически на M элементов вправо
Ребят, помогите срочно пожалуйста. Нужно: 1)Удалить все нечетные элементы массива. 2) Добавить...

Сдвинуть элементы массива циклически
подскажите алгоритм. Задан массив из k чисел. Сдвинуть элементы массива циклически на n позиций...

Сдвинуть (циклически) элементы одномерного массива
Привет помогите пожалуйста решить задачу. Сдвинуть (циклически) элементы одномерного массива из n...

3
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 23
04.06.2015, 15:07 2
YuliYu, у меня подобная задача
Дана матрица порядка MxN (M строк, N столбцов). Необходимо заполнить ее значениями и написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.
Реализация рабочая, просто мне не совсем понятно что куда тебе надо сдвинуть, поэтому выбери из тех 4 функций ту, которая подходит тебе
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
205
206
207
208
209
210
211
#include <iostream>
#include <time.h>
#include <stdlib.h>
 
using namespace std;
 
int **Initial(int m, int n)
{
    int **Arr = new int*[m];
 
    for (int i = 0; i < m; i++) // !
    {
        Arr[i] = new int[n];
    }
    return Arr;
}
 
void Filling(int m, int n, int **Arr)
{
    srand(time(NULL));
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            Arr[i][j] = rand() % 10 + 1;            
        }
    }
}
 
void ShowElements(int &m, int &n, int **Arr)
{
 
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << Arr[i][j] << "\t";
        }
        cout << "\n";
    }
}
 
void Delete(int &m, int **Arr)
{
    for (int i = 0; i < m; i++)
    {
        delete[]Arr[i];
    }
    delete[]Arr;
}
 
int **RowDown(int **Old, int &m, int &n)
{
    int k;  
    cout << "\nВведите количество строк, на которые нужно выполнить сдвиг ";
    cin >> k;       
    if (k > m) k = k - m;
    
    int **New = Initial(m, n);                  //создание нового массива  
 
    for (int i = 0; i < k; i++)
    {
        for (int j = 0; j < n; j++)
        {
            New[i][j] = Old[m - k + i][j];          //переписываем массив нижнюю часть массива вверх           
        }
    }   
 
    for (int i = k; i < m; i++)             //переписываем верхнюю часть массива вниз
    {
        for (int j = 0; j < n; j++)
        {
            New[i][j] = Old[i-k][j];            
        }
    }   
 
    Delete(m, Old);                 //удаление старого массива        
    return New;                     //возврат новой матрицы
}
 
int **RowUp(int **Old, int &m, int &n)
{
    int k;
    cout << "\nВведите количество строк, на которые нужно выполнить сдвиг ";
    cin >> k;
    if (k > m) k = k - m;                       //проверка валидности количества сдвигаемых и существующих строк
    
    int **New = Initial(m, n);                  //создание нового массива  
    
    for (int i = 0; i < m-k; i++)
    {
        for (int j = 0; j < n; j++)
        {
            New[i][j] = Old[i + k][j];          //переписываем массив нижнюю часть массива вверх           
        }
    }
    
    for (int i = m-k; i < m; i++)               //переписываем верхнюю часть массива вниз
    {
        for (int j = 0; j < n; j++)
        {
            New[i][j] = Old[i - (m - k)][j];
            
        }
    }
    
    Delete(m, Old);                 //удаление старого массива        
    return New;                     //возврат новой матрицы
}
 
int **ColumnLeft(int **Old, int &m, int &n)
{
    int k;
    cout << "\nВведите количество столбцов, на которые нужно выполнить сдвиг ";
    cin >> k;
    if (k > n) k = k - n;                       //проверка валидности количества сдвигаемых и существующих столбцов
    
    int **New = Initial(m, n);                  //создание нового массива  
 
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n-k; j++)
        {
            New[i][j] = Old[i][j + k];          //переписываем правую часть старого массива влево     
        }
 
        for (int j = n - k; j < n; j++)
        {
            New[i][j] = Old[i][j-(n-k)];        //переписываем левую часть старого массива вправо
        }
    }
 
    Delete(m, Old);                 //удаление старого массива        
    return New;
}
 
int **ColumnRight(int **Old, int &m, int &n)
{
    int k;
    cout << "\nВведите количество столбцов, на которые нужно выполнить сдвиг ";
    cin >> k;
    if (k > n) k = k - n;                       //проверка валидности количества сдвигаемых и существующих столбцов
    cout << "k=" << k << "\n";
 
    int **New = Initial(m, n);                  //создание нового массива  
 
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < k; j++)
        {
            New[i][j] = Old[i][j + (n - k)];    //переписываем      
        }
 
        for (int j = k; j < n; j++)
        {
            New[i][j] = Old[i][j-k];    //переписываем левую часть старого массива вправо
        }
    }
 
    Delete(m, Old);                             //удаление старого массива        
    return New;
}
 
int Menu(void)
{
    int action;
    do {
        cout << "Введите желаемое действие\n";
        cout << "0 - циклический сдвиг строк вниз\n";
        cout << "1 - циклический сдвиг строк вверх\n";
        cout << "2 - циклический сдвиг столбцов влево\n";
        cout << "3 - циклический сдвиг столбцов вправо\n";
        cin >> action;
    } while ((action < 0) || (action > 3));
    return action;
 
}
void main()
{
    int i;
    int m, n;
 
    setlocale(LC_ALL, "rus");
    cout << "Введите количество строк ";
    cin >> m;
    cout << "\nВведите количество  столбцов ";
    cin >> n;
 
    //Динамическое выделение памяти 
    int** matr = Initial(m, n);
 
    //Заполнение массива 
    Filling(m, n, matr);
 
    //вывод элементов
    cout << "\nИсходная матрица\n";
    ShowElements(m, n, matr);
    cout << "\n\n";
 
    int** (*Action[4])(int**, int&, int&) = { RowDown, RowUp, ColumnLeft, ColumnRight };
    i = Menu();                                 // получение выбора пользователя 
 
    matr = (*Action[i])(matr, m, n);        // выполнение     
 
    cout << "\nПолученная матрица\n";
    ShowElements(m, n, matr);
 
    //Последовательное уничтожение двумерного массива 
    Delete(m, matr);
    cout << "\n\n";
}
0
0 / 0 / 0
Регистрация: 20.04.2015
Сообщений: 20
04.06.2015, 16:43  [ТС] 3
Ну тут получается вводим двумерный массив:
1 2 3
4 5 6
по условию 0<k<N (N - кол-во строк в массиве), в данном случае 0<k<2, вводим значение k=1, т.е. элементы массива должны сдвинуться на одну позицию вниз:
4 5 6
1 2 3
0
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 23
05.06.2015, 09:32 4
ну функция RowDown это и реализует. Если принципиально то проверку попадает ли k в заданный диапазон можно убрать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2015, 09:32
Помогаю со студенческими работами здесь

Циклически сдвинуть все элементы vector вправо на 2 элемента
Заполнить массив данных (vector) случайными числами в диапазоне m1 - m2. m1=-5, m2=5 • сдвинуть...

Сдвинуть все элементы последовательности циклически на k позиций влево
1. Дано целое число. Если число отрицательное, то необходимо вывести все четные числа, начиная со...

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

Циклически сдвинуть все элементы неупорядоченного массива на k позиций вправо
Дан неупорядоченный линейный массив A, содержащий вещественные числа. Циклически сдвинуть все...


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

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

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