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

Циклический сдвиг в двумерном динамическом массиве - C++

Восстановить пароль Регистрация
 
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
03.12.2012, 19:06     Циклический сдвиг в двумерном динамическом массиве #1
Вот такая программа, надо сделать циклический сдвиг в двумерном динамическом массиве по такой вот схеме (см. рис).
да так, чтобы

В результате преобразования должна измениться матрица, просто вывести результат преобразования на экран недостаточно.

Код, выполняющий операцию над матрицей, оформить в виде функции, которой передается указатель на матрицу и размерность матрицы.

Все делаю. Запускаю. Ошибка, и все тут!!! Подскажите, пожалуйста, что не так и как исправить? вот код:

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
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;
//-------------------------------------------------------------------------------------------
int ** iniz(int** arr, int n, int m)            //функция инициализирущая матрицу
    {
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                arr[j][i]=rand()%10;
            }
        }
        return arr;
}
//-------------------------------------------------------------------------------------
void vyivod (int** arr, int n, int m)           //функция выводящая матрицу
    {
            cout << "matriza:\n";
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
                cout  << arr[j][i] << " ";
            cout << '\n';
        }
        cout << '\n';
        
}
//---------------------------------------------------------------------------------------
        int ** sortArr (int** arr, int n, int m){    //функция изменяющая массив
 
     int lastElement;       //запоминаем последний элемент
     if (n % 2 == 0){       // смотрим, сколько строк в массиве, и находим "последний" элемент в зависимости от этого
         lastElement = arr[n-1][0];
         }else{
         lastElement = arr[n-1][m-1]; }
     
     int ElementOne;                        
     int ElementTwo;
     for (int i = 0; i < n; i++){           //  для каждой строки опредяем свой вэй, стэп, финиш
         int way, step, finish;              // вэй - элемент с которого начнем изменять
                                         // степ - в какую сторону двигаемся (в четной справа налево, в нечет наоборот 
                        //  финиш - "последний" элемент, в чет -первый, в нечет - последний
         if (i % 2 == 0){    //  определяем стэп, вэй, финиш для чет и нечет строк
                             
               way = 0;
               step = 1;
               finish = (m - 1);
               }else{
                     way = m - 1;
                     step = -1;
                     finish = 0;  }
        
        //далле поставим 0 элемент на место 1, запомнив его.
         if (i == 0){                                    // нулевую строку обработаем отдельно, чтобы объявить ЭлементВан
         ElementOne = arr[i][way + step];
         arr[i][way + step] = arr[i][way]; 
         }else{                                         //  для остальных строк        
               ElementTwo = arr[i][way + step];
               arr[i][way + step] = ElementOne;
               ElementOne = ElementTwo;
               }               
                      
         for (int j = (way + step + step); j != (finish + step); j += step){  //по элементам строки, начиная со 2
             if (j == finish){                                                                 // это если дошли до последнего
                   int lastSwap = arr[i][finish];
                   arr[i][finish] = ElementOne;
                   ElementTwo = arr[i + 1][finish];
                   arr[i + 1][finish] = lastSwap;
                     ElementOne = ElementTwo;
                   }else{                                                                 //а если не последний просто меняет на предыдущий     //запоминая его
             ElementTwo = arr[i][j];  // запоминаем
             arr[i][j] = ElementOne;
             ElementOne = ElementTwo; //  заменяем              }
            } 
                
        } 
     arr[0][0] = lastElement; // ставим на место первого последний
    return arr;
    }
    //------------------------------------------------------------------------------------------
 
int main()
{
    int n,m;
    srand ((unsigned int)time (NULL));
    cout << "n" ; cin >> n ;
    cout << "m";  cin >> m;
    
    int **arr = (int**)malloc(m*sizeof(int*));      //объявление матрицы на экран
    for(int i = 0; i < m; i++)
        arr[i] = (int*)malloc(n*sizeof(int));
    
  iniz(arr,n,m);    //иницилизация
    
vyivod(arr,n,m);  //вывод
 
    sortArr (arr,n,m);  //сортируем
 
    vyivod(arr,n,m); //вывод измененной матрицы
   
    free (arr);
    getch();
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2012, 19:06     Циклический сдвиг в двумерном динамическом массиве
Посмотрите здесь:

Сдвиг в динамическом массиве C++
C++ Как происходит циклический сдвиг (как сдвинуть элементы в массиве)
В двумерном динамическом массиве найти произведение отрицательных элементов массива C++
В двумерном динамическом массиве найти максимум в каждой строке C++
C++ Функция для удаления элемента в двумерном динамическом массиве. В чем ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
03.12.2012, 19:10  [ТС]     Циклический сдвиг в двумерном динамическом массиве #2
ах, рисунок
Изображения
 
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11837 / 6816 / 771
Регистрация: 27.09.2012
Сообщений: 16,906
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 18:32     Циклический сдвиг в двумерном динамическом массиве #3
http://www.cyberforum.ru/cpp-beginne...ead297853.html
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
04.12.2012, 18:41  [ТС]     Циклический сдвиг в двумерном динамическом массиве #4
Да, но я почти уверена что сам сдвиг верный, т.к. когда делаю его не на динамическом массиве все ок, а когда соединяю все части (инициализация, вывод, ввод матрицы) и делаю так, чтобы функция массива возвращала указатель, то все рушиться.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11837 / 6816 / 771
Регистрация: 27.09.2012
Сообщений: 16,906
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 18:49     Циклический сдвиг в двумерном динамическом массиве #5
Когда Вы создаете массив на стеке, он выделяется непрерывным куском, а когда Вы выделяете массив так:
C++
1
2
3
    int **arr = (int**)malloc(m*sizeof(int*));      //объявление матрицы на экран
    for(int i = 0; i < m; i++)
        arr[i] = (int*)malloc(n*sizeof(int));
то массив получается раскиданным по разным участкам памяти

Добавлено через 1 минуту
Выделяйте его тогда тоже сплошным
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
04.12.2012, 19:02  [ТС]     Циклический сдвиг в двумерном динамическом массиве #6
а как же это исправить?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11837 / 6816 / 771
Регистрация: 27.09.2012
Сообщений: 16,906
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 19:32     Циклический сдвиг в двумерном динамическом массиве #7
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
#include <iostream>
#include <random>
#include <ctime>
#include <iomanip>
 
 
void foo(int ** pArr,int _w, int _h, int count){
    int size=_w*_h;
    count=count%size;
    int * pTemp=new int[count];
    memmove(pTemp,((*pArr)+size-count),count*sizeof(**pArr));
    memmove((*pArr)+count,*pArr,(size-count)*sizeof(**pArr));
    memmove(*pArr,pTemp,count*sizeof(**pArr));
    delete [] pTemp;
}
 
 
int main(){
    srand(time(0));
    const int width=5;
    const int height=7;
    int ** pArr=new int*[height];
    int * ptemparr=new int[width*height];
    pArr[0]=ptemparr;
    for(int i=1;i<height;++i)
        pArr[i]=pArr[i-1]+width;
 
 
    for(int i=0;i<height;++i){
        for(int j=0;j<width;++j){
            pArr[i][j]=rand()%100;
            std::cout<<std::setw(3)<<pArr[i][j];
        }
        std::cout<<std::endl;
    }
 
    foo(pArr,width,height,3);
 
    std::cout<<std::endl;
    for(int i=0;i<height;++i){
        for(int j=0;j<width;++j){
            std::cout<<std::setw(3)<<pArr[i][j];
        }
        std::cout<<std::endl;
    }
    delete [] *pArr;
    delete [] pArr;
 
    std::cin.get();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 19:49     Циклический сдвиг в двумерном динамическом массиве
Еще ссылки по теме:

C++ Найти в двумерном динамическом массиве сумму строк и сумму столбцов и сравнить их
Подсчет повторяющихся слов в двумерном динамическом массиве C++
C++ Поиск в динамическом двумерном массиве работает некорректно

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

Или воспользуйтесь поиском по форуму:
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
04.12.2012, 19:49  [ТС]     Циклический сдвиг в двумерном динамическом массиве #8
Спасибо, но только сдвиг по другому надо сделать... как на картинке...
Yandex
Объявления
04.12.2012, 19:49     Циклический сдвиг в двумерном динамическом массиве
Ответ Создать тему
Опции темы

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