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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.88
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
16.05.2012, 22:55     Циклический сдвиг матрицы #1
Всем доброго дня. Программа располагает двумерный массив в динамичной памяти и сдвигает его на Т элементов влево.
вопрос вот в чем: Как изменить 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
16.05.2012, 23:11     Циклический сдвиг матрицы #2
Незнаю поможет Вам или нет!!
Вот завалялась программа, сдвигает элементы матрицы вправо и вниз, в зависимости от выбраного режима!

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

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 байт, 26 просмотров)
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
17.05.2012, 17:20  [ТС]     Циклический сдвиг матрицы #3
довольно сложное что-то, громоздкое и совсем непонятное..

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

что за алгоритм. Объясните пожалуйста
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.05.2012, 00:46     Циклический сдвиг матрицы #6
Что за алгоритм я написал, я и сам не знаю, но принцип таков. Новая позиция элемента равна (текущая позиция элемента + величина сдвига) % размер строки массива. Можете сами на листочке проверить. Может есть и более сложные и эффективные алгоритмы, но этот очевидно самый простой. Вот его пример. Правда тут использованы некоторые стандартные функции, но я считаю их использование легальным
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];
      }
   }
}
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
18.05.2012, 01:14  [ТС]     Циклический сдвиг матрицы #7
(текущая позиция элемента + величина сдвига) % размер строки
это нахождение позиции столбца.
как на счет строки?
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.05.2012, 01:17     Циклический сдвиг матрицы #8
При сдвиге вправо по-моему изменяется только положение столбцов определенной строки или вы имеете в виду, что сдвиг матрицы этой матрицы на одно поле вправо должен быть таким?
from
1 2
3 4
to
4 1
3 2
Объясните, как вы вообще представляете сдвиг матрицы
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
18.05.2012, 09:14  [ТС]     Циклический сдвиг матрицы #9
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]
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.05.2012, 11:50     Циклический сдвиг матрицы #10
Ясно, я так и подозревал. Но алгоритм, в принципе, будет тот же самый как и для одной строки, ведь даже четырёхмерный массив занимает в виртуальной памяти непрерывную последовательность элементов, которую можно рассматривать как одну строку. С арифметикой указателей знакомы? Вот через неё можно рассматривать этот массив, как единую строку. Есть, конечно, формулы для вычисления через индексы, но поверьте мне - они будут совсем некрасивы и непонятны
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
18.05.2012, 11:54  [ТС]     Циклический сдвиг матрицы #11
с указателями знаком, но как-то плохо представляю себе двумерный массив строкой.
можно пример?
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.05.2012, 17:45     Циклический сдвиг матрицы #12
Блин, вы меня вечно разоблачаете. С указательной арифметикой выйдет всё тоже не так просто, он вроде оказывается не совсем беспрерывный, лучше через индексы, по старой доброй формуле
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 ) элементов, а далее применить тот "мой" алгоритм, а затем скоировать данные из временного массива в начало измененной матрицы. А лучше меня не слушать вообще, а просто тупо скопипастить первый попавшийся алгоритм с гугла а то меня несёт
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
19.05.2012, 14:56  [ТС]     Циклический сдвиг матрицы #13
если бы это было в гугле, я бы тут не писал. Там в основном одномерные массивы.
либо стандартные функции.


вот например мой код сдвига влево:
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 минут
помогите кто-нибудь
*хнык*
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
19.05.2012, 16:16     Циклический сдвиг матрицы #14
Ну так сдвиг влево - это все равно что вправо, только на период ( размер массива - Величина сдвига влево ) или что-то вроде того
Вот написал, понимаю - это далекоо не идеал, но работает-таки
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 минут
ЗЫ совсем забыл в конце функции лучше освобождать динамически выделенную память, а то утечка памяти ведь
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
20.05.2012, 16:58  [ТС]     Циклический сдвиг матрицы #15
код не рабочий

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];
   }
}
виндовс выдает ошибку. Что не так? что-то с памятью=)
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
20.05.2012, 19:06     Циклический сдвиг матрицы #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
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 );
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 22:54     Циклический сдвиг матрицы
Еще ссылки по теме:

Как осуществить циклический сдвиг элементов квадратной матрицы C++
C++ Циклический сдвиг матрицы MxN
Выполнить циклический сдвиг элементов квадратной матрицы, используя локальные и динамические массивы C++

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

Или воспользуйтесь поиском по форуму:
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
20.05.2012, 22:54  [ТС]     Циклический сдвиг матрицы #17
у вас кстати второй раз ошибка. Дважды объявляете переменную i
спасибо все прекрасно работает :dance3:
Yandex
Объявления
20.05.2012, 22:54     Циклический сдвиг матрицы
Ответ Создать тему
Опции темы

Текущее время: 16:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru