Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/107: Рейтинг темы: голосов - 107, средняя оценка - 4.68
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39

Циклический сдвиг матрицы

16.05.2012, 22:55. Показов 21625. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня. Программа располагает двумерный массив в динамичной памяти и сдвигает его на Т элементов влево.
вопрос вот в чем: Как изменить void func(int **arr, int size, int stift) , чтобы сдвигало массив вправо, а не влево?

Код:
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
//фукнция сдвига
//на входе подается указатель на начало массива
//размер массива и на сколько сдвигать
 
void func(int **arr, int size, int stift)
{
    int **tmp=(int**)malloc(size*sizeof(int*));
    int i,j,iPos,jPos;
 
    for(i=0;i<size;++i)
        tmp[i]=(int*)malloc(size*sizeof(int));
 
    for(i=0;i<size;++i)
        for(j=0;j<size;++j)
        {
            iPos=i+(stift+j)/size;
            if(iPos>=size) iPos%=size;
                jPos=(stift+j)%size;
            tmp[i][j]=arr[iPos][jPos];
        }
 
    for(i=0;i<size;++i)
    {
        for(j=0;j<size;++j)
            arr[i][j]=tmp[i][j];
        free(tmp[i]);
    }
 
    free(tmp); 
}
 
int main()
{
    int **arr,i,j,stift,size;
    printf("Enter size of matrix ");
    scanf("%d",&size);
    printf("\n");
    srand(time(NULL));
    arr=(int**)malloc(size*sizeof(int*));
 
//случайное заполнение
//и вывод двумерного массива
    for(i=0;i<size;++i)
    {
        arr[i]=(int*)malloc(size*sizeof(int));
        for(j=0;j<size;++j)
        {
            arr[i][j]=-50+rand()%100;
            printf("%d\t",arr[i][j]);
        }
        printf("\n");
    }
 
    printf("Enter nuber of stift ");
    scanf("%d",&stift);
    func(arr,size,stift);
    printf("\n");
 
//вывод нового двумерного массива
//размерами i на j
    for(i=0;i<size;++i)
    {
        for(j=0;j<size;++j)
            printf("%d\t",arr[i][j]);
        free(arr[i]);
        printf("\n");
    }
    free(arr);
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2012, 22:55
Ответы с готовыми решениями:

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

Циклический сдвиг матрицы MxN
Ребята вот есть, например, матрица: 123 456 надо что бы получилось 412 563 при таком примере шаг равняется 1. Мой вариант с...

Выполнить циклический сдвиг столбцов матрицы
Здравствуйте, помогите, пожалуйста, написать эту программу: Динамически выделить память под N*M элементов вещественного типа float....

18
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
16.05.2012, 23:11
Незнаю поможет Вам или нет!!
Вот завалялась программа, сдвигает элементы матрицы вправо и вниз, в зависимости от выбраного режима!

Матрица считывается и записывается в файл

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
#include "iostream"
#include "fstream"
 
using namespace std;
 
enum direction 
{ 
    right = 1, down 
}; // направление сдвига - в право / в лево
 
/* функция moves "сдвигает" массив вправо или вниз
mass - массив
change - количество элементов на которое происходит сдвиг
motion - в право (right) или в низ (down) */
void moves(int **mass, int change, direction motion, int n);
int **Matrix(int n); //прототип функции которая выделяет память под динамический массив
int **mass = 0; //указатель на нулевой массив
 
int main()
{
    setlocale(LC_CTYPE,"Russian"); //русский шрифт в консоле
 
    int n, i, j, change, motion; //объявляем целочисленные переменные
    cout << "Введите размерность матрицы(одно число, так как матрица квадратная): ";
    cin >> n; //считываем размер матрицы 
 
    mass = Matrix(n); //вызываем функцию которая выделяет память под динамический массив
    
    ifstream inarray("matrix.txt"); // открытие файла для ввода;
    if (!inarray) //если файла не существует
    {
        cout << "File can not be opened" << endl; //выводим сообщение
        return 0;   //выход из программы
    }
 
    for (i = 0; i < n ; ++i)
    {
        for (j = 0; j < n; ++j) 
        {
            inarray >> mass[i][j]; //считываем матрицу из файла matrix.txt
        }                           
    }                               
    inarray.close(); //закрываем файл
 
    ofstream outarray("matrix1.txt");//открытие файла для вывода
    if (!outarray) ////если файла не существует
    {
        cout << "File cannot be opened" << endl;//выводим сообщение
        return 0; // выход из программы
    }
 
    while(1)
    {
        // выводим массив на консоль
        for( i = 0; i < n; ++i )
        {
            for( j = 0; j < n; ++j )
            {
                cout << mass[i][j] << " ";
            }
        cout << endl;    
        }
        // спрашиваем куда двигать будем
        // 1 - в паво; 2 - в низ;  0 - выход из программы
        cout << "\n\nВыберите направление сдвига\n1 - Вправо\n2 - Вниз\n0 - Выход\nВаш выбор - ";
        cin >> motion; // считываем число
        if( motion < 1 || motion > 2) //если меньше 0 или больше 2, тогда... 
        {
            return 0; //завершаем програму
        }
        // спрашиваем на сколько надо сдвинуть
        cout << "\nНа сколько элементов сдвинуть? - ";
        cin >> change;
        if( change <= 0) //если число меньше или равно нулю, тогда...
            {
                return 0; //завершаем програму
            }
        // сдвигаем
        moves(mass, change, (direction)motion, n); //вызываем функцию которая сдвигает элементы
 
        
        for (i = 0; i < n; ++i)
        {
            for ( j = 0; j < n; ++j)
            {
                outarray << mass[i][j] << " "; ////выводим в matrix1.txt массив с переставлеными столбцами 
            }
            outarray << endl;
        }
        outarray << endl;
 
        cout << endl;
    }
    
    // высвобождение динамической памяти
    for (i = 0; i < n; ++i)
        delete [] mass[i];
    delete [] mass;
 
    return 0;
}
 
int **Matrix(int n) //описания функции динамического выделения памяти под матрицу
{
    int i; //обьявили переменую
    int **matr = new int *[n]; // указатель на массив указ-лей;
    for (i = 0; i < n; ++i) 
        matr[i] = new int [n];  
                
    return matr; //возвращаем массив
}
 
 
void moves(int **mass, int change, direction motion, int n) //функция сдвига
{
        int begin = 0; // начало массива
        int position = begin + change - 1;  // позиция записи в промежуточный массив
        int mas[100]; // промежуточный массив
        int i, j; // счётчики циклов
 
        for ( j = 0; j < n; ++j )
        {
        // 1) копируем числа в промежуточный массив
        for( i = 0; i < n; ++i )
        {
            if( position >= n - 1 ) 
            {
                position = begin;
            }
            else
            {
                position++;
            }
                if( motion == direction::right ) // если сдвигаем в право
                {
                    mas[position] = mass[j][i];
                }            
                else // если сдвигаем вниз
                {
                    mas[position] = mass[i][j];
                }
        }
        for( i = 0; i < n; ++i )
        {
            if(motion == direction::right)
            {
                mass[j][i] = mas[i];
            }
            else
            {
                mass[i][j] = mas[i];
            }
        }
    }
}
Желательно ввести размер матрицы такой как в matrix.txt

Не по теме:


сопровождение и консультация не предоставляется

Миниатюры
Циклический сдвиг матрицы  
Вложения
Тип файла: txt matrix.txt (209 байт, 53 просмотров)
1
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
17.05.2012, 17:20  [ТС]
довольно сложное что-то, громоздкое и совсем непонятное..

мне бы сам алгоритм, как меняется строка и столбец при сдвиге вправо.
а код и сам напишу.
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
17.05.2012, 18:41
просто обменивай соседние элементы данной строки по следующему алгоритму
std::swap( matrix[i][j], matrix[i][ ( j + shiftValue ) % MATRIX_SIZE ] );
std::swap() - это стандартная функция библиотеки алгоритмов. Там вообще много полезных алгоритмов, для вашей задачи, например, идеально подойдёт std::rotate()
0
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
17.05.2012, 23:51  [ТС]
нельзя использовать стандартные функции

что за алгоритм. Объясните пожалуйста
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
18.05.2012, 00:46
Что за алгоритм я написал, я и сам не знаю, но принцип таков. Новая позиция элемента равна (текущая позиция элемента + величина сдвига) % размер строки массива. Можете сами на листочке проверить. Может есть и более сложные и эффективные алгоритмы, но этот очевидно самый простой. Вот его пример. Правда тут использованы некоторые стандартные функции, но я считаю их использование легальным
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
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstdlib>
#include <ctime>
 
void printMatrix( int **matrix, const int rows, const int columns );
void shiftRight( int **matrix, const int rows, const int columns,
                 int shiftValue );
 
int main()
{
   const int rows = 5;
   const int columns = 5;
   int **matrix = 0;
 
   srand( time(0) );
   matrix = new int*[ rows ];
   for ( int i = 0; i < rows; ++i )
   {
      matrix[i] = new int[ columns ];
      for ( int j = 0; j < columns; ++j )
      {
         matrix[i][j] = rand() % 201 - 100;
      }
   }
 
   printMatrix( matrix, rows, columns );
   shiftRight( matrix, rows, columns, 2 );
   std::cout << "-----------------" << std::endl;
   printMatrix( matrix, rows, columns );
 
   return 0;
}
 
void printMatrix( int **matrix, const int rows, const int columns )
{
   for ( int i = 0; i < rows; ++i )
   {
      for ( int j = 0; j < columns; ++j )
      {
         std::cout << std::setw( 4 ) << matrix[i][j];
      }
      std::cout << std::endl;
   }
}
 
void shiftRight( int **matrix, const int rows, const int columns,
                 int shiftValue )
{
   shiftValue = shiftValue % columns;
   int *tempArr = new int[ columns ];
 
   for ( int i = 0; i < rows; ++i )
   {
      // копирование текущей строки во временный массив
      std::copy( matrix[i], matrix[i] + columns, tempArr );
      for ( int j = 0; j < columns; ++j )
      {
         matrix[i][ ( j + shiftValue ) % columns ] = tempArr[j];
      }
   }
}
0
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
18.05.2012, 01:14  [ТС]
(текущая позиция элемента + величина сдвига) % размер строки
это нахождение позиции столбца.
как на счет строки?
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
18.05.2012, 01:17
При сдвиге вправо по-моему изменяется только положение столбцов определенной строки или вы имеете в виду, что сдвиг матрицы этой матрицы на одно поле вправо должен быть таким?
from
1 2
3 4
to
4 1
3 2
Объясните, как вы вообще представляете сдвиг матрицы
0
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
18.05.2012, 09:14  [ТС]
1 2 3
4 5 6
7 8 9

сдвигаем на 4 вправо и получаем:
6 7 8
9 1 2
3 4 5

a[1][1] ->a[2][2]
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
18.05.2012, 11:50
Ясно, я так и подозревал. Но алгоритм, в принципе, будет тот же самый как и для одной строки, ведь даже четырёхмерный массив занимает в виртуальной памяти непрерывную последовательность элементов, которую можно рассматривать как одну строку. С арифметикой указателей знакомы? Вот через неё можно рассматривать этот массив, как единую строку. Есть, конечно, формулы для вычисления через индексы, но поверьте мне - они будут совсем некрасивы и непонятны
0
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
18.05.2012, 11:54  [ТС]
с указателями знаком, но как-то плохо представляю себе двумерный массив строкой.
можно пример?
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
18.05.2012, 17:45
Блин, вы меня вечно разоблачаете. С указательной арифметикой выйдет всё тоже не так просто, он вроде оказывается не совсем беспрерывный, лучше через индексы, по старой доброй формуле
main.cpp

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
#include <iostream>
 
 
int main()
{
   const int rows = 3;
   const int columns = 3;
   int counter = 1;
   int **arr = 0;
 
   arr = new int*[ rows ];
   for ( int i = 0; i < rows; ++i )
   {
      arr[i] = new int[ columns ];
      for ( int j = 0; j < columns; ++j )
      {
         arr[i][j] = counter;
         counter++;
         std::cout << arr[i][j] << ' ';
      }
   }
   std::cout << std::endl;
   std::cout << "-------------" << std::endl;
 
   for ( int i = 0; i < rows * columns; ++i )
   {
      std::cout << arr[ i / columns ][ i % columns ] << ' ';
   }
   std::cout << std::endl;
 
   return 0;
}

Но вот копировать всю всю матрицу в отдельные временный массив не обязательно, достаточно создать массив последних ( MATRIX_SIZE - shiftValue ) элементов, а далее применить тот "мой" алгоритм, а затем скоировать данные из временного массива в начало измененной матрицы. А лучше меня не слушать вообще, а просто тупо скопипастить первый попавшийся алгоритм с гугла а то меня несёт
0
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
19.05.2012, 14:56  [ТС]
если бы это было в гугле, я бы тут не писал. Там в основном одномерные массивы.
либо стандартные функции.


вот например мой код сдвига влево:
C++
1
2
3
4
5
6
7
8
    for(i=0;i<size;++i)
        for(j=0;j<size;++j)
        {
            iPos=i+(stift+j)/size;
            if(iPos>=size) iPos%=size;
                jPos=(stift+j)%size;
            tmp[i][j]=arr[iPos][jPos];
        }
здесь всё предельно ясно и понятно. Четко видно где изменяется i, а где j
изменение i: i+(stift+j)/size (строка)
изменение j: (stift+j)%size (при условии что сдвиг больше размера строки if(iPos>=size) )

нужен точно такой же код только вправо) и всё

Добавлено через 17 часов 37 минут
помогите кто-нибудь
*хнык*
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
19.05.2012, 16:16
Ну так сдвиг влево - это все равно что вправо, только на период ( размер массива - Величина сдвига влево ) или что-то вроде того
Вот написал, понимаю - это далекоо не идеал, но работает-таки
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
#include <iostream>
#include <iomanip>
 
void printMatrix( int **matrix, const int rows, const int columns );
void shiftRight( int **matrix, const int rows, const int columns,
                 int shiftValue );
 
 
int main()
{
   const int rows = 3;
   const int columns = 3;
   int counter = 1;
   int **matrix = 0;
 
   matrix = new int*[ rows ];
   for ( int i = 0; i < rows; ++i )
   {
      matrix[i] = new int[ columns ];
      for ( int j = 0; j < columns; ++j )
      {
         matrix[i][j] = counter++;
      }
   }
 
   printMatrix( matrix, rows, columns );
   std::cout << "-------------" << std::endl;
   shiftRight( matrix, rows, columns, 4 );
   printMatrix( matrix, rows, columns );
 
   return 0;
}
 
void printMatrix( int **matrix, const int rows, const int columns )
{
   for ( int i = 0; i < rows; ++i )
   {
      for ( int j = 0; j < columns; ++j )
      {
         std::cout << std::setw( 4 ) << matrix[i][j];
      }
      std::cout << std::endl;
   }
}
 
void shiftRight( int **matrix, const int rows, const int columns,
                 int shiftValue )
{
   const int MATRIX_SIZE = rows * columns;
   shiftValue = shiftValue % MATRIX_SIZE;
   int *tempArr = new int[ rows * columns ];
 
   for ( int i = 0; i < MATRIX_SIZE; ++i )
   {
      tempArr[i] = matrix[ i / columns ][ i % columns ];
   }
 
   for ( int i = 0; i < MATRIX_SIZE; ++i )
   {
      matrix[ i / columns ] [i % columns ] = tempArr[ (i + MATRIX_SIZE - shiftValue) % MATRIX_SIZE ];
   }
}
Добавлено через 13 минут
ЗЫ совсем забыл в конце функции лучше освобождать динамически выделенную память, а то утечка памяти ведь
0
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
20.05.2012, 16:58  [ТС]
код не рабочий

C++
1
2
3
4
5
6
7
8
for ( int i = 0; i < MATRIX_SIZE; ++i )
{
   tempArr[i] = matrix[ i / columns ][ i % columns ];
}
for ( int i = 0; i < MATRIX_SIZE; ++i )
{
   matrix[ i / columns ] [i % columns ] = tempArr[ (i + MATRIX_SIZE - shiftValue) % MATRIX_SIZE ];
}
я так понимаю это основное, что мне надо?) хм... попробуй разобраться, но когда просплюсь

Добавлено через 8 часов 34 минуты
C++
1
2
const int rows = 3;
   const int columns = 3;
не понимаю зачем эти две строчки, массив же динамический и не обязательно 3 на 3, а любой. размер вводится с клавиатуры
ага... и где мне тогда взять значение columns для функции сдвига потом?

Добавлено через 1 час 25 минут
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
//программа циклического сдвига
//заданного массива целых чисел
//на T элементов вправо
 
 
#include <iostream>
#include <iomanip>
 
void shiftRight( int **matrix, int rows, int columns, int shift);
 
 
int main()
{
    int rows,columns,shift,i,j;
    int **matrix;
    printf("Enter rows and columns of matrix ");
    scanf("%d",&rows);
    scanf("%d",&columns);
//случайное заполнение
//и вывод двумерного массива
    for(i=0;i<rows;++i)
    {
        matrix[i]=(int*)malloc(rows*columns*sizeof(int));
        for(j=0;j<columns;++j)
        {
            matrix[i][j]=-50+rand()%100;
            printf("%d\t",matrix[i][j]);
        }
        printf("\n");
    }
 
    printf("Enter nuber of shift ");
    scanf("%d",&shift);
    shiftRight(matrix,rows,columns,shift);
    printf("\n");
    
    for(i=0;i<rows;++i)
    {
        for(j=0;j<columns;++j)
            printf("%d\t",matrix[i][j]);
        printf("\n");
    }
    return 0;
}
 
 
void shiftRight( int **matrix, int rows, int columns, int shift)
{
   int size = rows * columns;
   shift = shift % size;
   int *temp_matrix = new int[ rows * columns ];
 
   for ( int i = 0; i < size; ++i )
   {
      temp_matrix[i] = matrix[ i / columns ][ i % columns ];
   }
 
   for (i = 0; i < size; ++i )
   {
      matrix[i / columns] [i % columns] = temp_matrix[(i + size - shift) % size];
   }
}
виндовс выдает ошибку. Что не так? что-то с памятью=)
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
20.05.2012, 19:06
Лучший ответ Сообщение было отмечено Вечный_Студент как решение

Решение

Ну так вы неправильно выполняете выделение памяти под массив
Надо так
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
//программа циклического сдвига
//заданного массива целых чисел
//на T элементов вправо
 
 
#include <stdlib.h>
#include <stdio.h>
 
void shiftRight( int **matrix, int rows, int columns, int shift);
 
 
int main()
{
   int rows,columns,shift,i,j;
   int **matrix;
   printf("Enter rows and columns of matrix ");
   scanf("%d",&rows);
   scanf("%d",&columns);
   //случайное заполнение
   //и вывод двумерного массива
   matrix = ( int ** ) malloc( rows * sizeof (int *) );
   for(i=0;i<rows;++i)
   {
      matrix[i] = (int *)malloc( columns * sizeof (int) );
      for(j = 0; j < columns; ++j)
      {
         matrix[i][j]= -50 + rand()%100;
         printf( "%3d\t", matrix[i][j] );
      }
      printf("\n");
   }
 
   printf("Enter nuber of shift: ");
   scanf( "%d", &shift );
   shiftRight( matrix, rows, columns, shift );
   printf("\n");
 
   for( i = 0; i < rows; ++i )
   {
      for( j = 0; j < columns; ++j )
         printf( "%3d\t", matrix[i][j] );
      printf("\n");
   }
 
   for( i = rows - 1; i >= 0; --i )
      free( matrix[i] );
   free( matrix );
 
   return 0;
}
 
 
void shiftRight( int **matrix, int rows, int columns, int shift )
{
   int i;
   int MATRIX_SIZE = rows * columns;
   shift = shift % MATRIX_SIZE;
 
   if ( shift == 0 )
      return;
 
   int *temp_matrix = (int *) malloc( MATRIX_SIZE * sizeof (int) );
 
   for ( int i = 0; i < MATRIX_SIZE; ++i )
   {
      temp_matrix[i] = matrix[ i / columns ][ i % columns ];
   }
 
   for (i = 0; i < MATRIX_SIZE; ++i )
   {
      matrix[i / columns] [i % columns] = temp_matrix[(i + MATRIX_SIZE - shift) % MATRIX_SIZE];
   }
 
   free( temp_matrix );
}
1
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
20.05.2012, 22:54  [ТС]
у вас кстати второй раз ошибка. Дважды объявляете переменную i
спасибо все прекрасно работает :dance3:
0
0 / 0 / 0
Регистрация: 19.10.2016
Сообщений: 16
20.12.2016, 01:24
Buckstabue, а как сделать чтобы сдвиг был еще и вниз?
0
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 10
12.09.2019, 18:28
У матрицы сдвигаются строки которые выходят за границу и переходят на следующую, как это исправить? Чтоб колонки сдвигались не меняя позиции строк?
Миниатюры
Циклический сдвиг матрицы  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2019, 18:28
Помогаю со студенческими работами здесь

Осуществить циклический сдвиг матрицы по условию
Необходимо осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз. Я абсолютный новичок в C++. В...

Циклический сдвиг элементов прямоугольной матрицы
Мне нужно сделать такую программу: Осуществить циклический сдвиг элементов прямоугольной матрицы на п элементов вправо или вниз (в...

Осуществить циклический сдвиг элементов прямоугольной матрицы
Здравствуйте, было задание Осуществить циклический сдвиг элементов прямоугольной матрицы на п элементов вправо или вниз (в зависимости...

Осуществить циклический сдвиг элементов прямоугольной матрицы
Задание. Задания этого семинара соответствуют приведенным в Учебнике на с. 139. Рекомендуется выполнять каждое задание в двух вариантах:...

Осуществить циклический сдвиг элементов прямоугольной матрицы
Здравствуйте!!! Моя задача состоит в том: Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо и вниз(в...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru