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

Сдвинуть элементы двумерного массива на k позиций влево - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Sheptashka
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 22
04.12.2012, 22:18     Сдвинуть элементы двумерного массива на k позиций влево #1
Немножко не умею пользоваться динамическими массивами.
Из-за этого кажется сделал глупые ошибки в программе
Суть программы:
Сдвинуть элементы массива на k позиций влево.
Пример
1 2
3 4
сдвиг на 1 влево
2 3
4 1

Мой вариант

C++ (Qt)
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
int main()
{
int i,j,a,k;
 
cout<<"vvedite sdvig matricy"<<endl;
 
cin >> k;
 
 
 
 
cout<<"vvedite razmernost matricy"<<endl;
    cin>>a;
 
int* mas=new int[a][a];      //////  Косяк в этих двух строчках
 
int* sam=new int[a][a];      ////// Не знаю как динамически выделить память под эти массивы.
 
 
    cout<<"razmernost matricy = "<<a<<endl;
    cout<<"vvedite elementy matricy po poryadky: "<<endl;
 
    
    
    for (i=0;i<a;i++)
    {
    for (j=0;j<a;j++)
    {
    cin>>mas[i][j]; 
    }
    }
 
    cout<<"zapolnyaem matricy chislami po poryadky..."<<endl;
 
    for (i=0;i<a;i++)
    {
    for (j=0;j<a;j++)
    {
    cout<<mas[i][j]<<" ";   
    }
    cout<<endl;
    }
 
int* p_mas = &mas[0][0];
for (i=0; i<a; i++)
{
for (j=0; j<a; j++)
{
sam[i][j]=*(p_mas+(i*a+j+k)%(a*a));
}
}
 
cout<<"result:"<<endl;
for (i=0;i<a;i++)
    {
        for (j=0;j<a;j++)
        {
            cout<<sam[i][j]<<' ';
        }
        cout<<endl;
    }
 
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2012, 22:18     Сдвинуть элементы двумерного массива на k позиций влево
Посмотрите здесь:

Сдвинуть элементы массива циклически на n позиций вправо. C++
Сдвинуть все элементы последовательности циклически на k позиций влево C++
Сдвинуть циклически элементы одномерного массива на k позиций влево C++
Все элементы массива X(30) циклически сдвинуть на n позиций влево C++
Одномерный массив. Сдвинуть элементы циклически на n позиций влево C++
элементы вещественного массива сдвинуть на k позиций влево C++
Одномерный массив, Сдвинуть элементы массива циклически на n позиций вправо C++
Сдвинуть элементы одномерного динамического массива на заданное число позиций влево C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 22:40     Сдвинуть элементы двумерного массива на k позиций влево #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
#include <iostream>
#include <random>
#include <ctime>
#include <iomanip>
 
 
void foo_right(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;
}
void foo_left(int ** pArr,int _w, int _h, int count){
    int size=_w*_h;
    count=count%size;
    int * pTemp=new int[count];
     memmove(pTemp,*pArr,count*sizeof(**pArr));
     memmove(*pArr,(*pArr)+count,(size-count)*sizeof(**pArr));
     memmove((*pArr)+size-count,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_left(pArr,width,height,2);
 
    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;
}
Добавлено через 1 минуту
C++
1
2
void foo_right(int ** pArr,int _w, int _h, int count)//Сдвиг вправо - pArr - указатель на массив(массив выделен сплошным блоком памяти), _w,_h - "ширина и высота" массива, count - на сколько сдвинуть
void foo_left(int ** pArr,int _w, int _h, int count)//Сдвиг влево. Параметры те же
Sheptashka
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 22
04.12.2012, 22:43  [ТС]     Сдвинуть элементы двумерного массива на k позиций влево #3
А можно ли как-то вводить размерность матрицы (квадратной)
и элементы массива соответственно самому вручную с клавиатуры в консольном режиме?
Yandex
Объявления
04.12.2012, 22:43     Сдвинуть элементы двумерного массива на k позиций влево
Ответ Создать тему
Опции темы

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