Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
1

Сдвиг массива

12.10.2017, 19:45. Показов 506. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Есть класс
C++
1
myClass
Есть двумерный массив экземпляров класса
C++
1
2
3
4
5
myClass **obj;
obj = new myClass * [5];
for (int x(0); x < 5; x++) {
    obj[x] = new myClass [5];
}
Нужно сдвинуть элементы массива, например влево, т.е. чтобы элемент 0-го индекса сдвигался в 1-ый, 1 во второй и т.д. Я делаю так:
C++
1
2
3
4
5
6
7
delete[] obj[4];
for (int i(4); i > 0; i--) {
    for (int j(0); j < 5; j++) {
        obj[i][j] = obj[i - 1][j];
    }
}
obj[0] = new myClass [5];
Но по факту это не работает, мне сложно сформулировать то, что происходит, но как-будто элементы не перемещаются. т.е. удаление экземпляров происходит, а перемещения нет.
Собственно вопрос, как правильно сдвинуть элементы массива? но это не числа, а экземпляры класса. С числами всё работает, а вот с классами - нет
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2017, 19:45
Ответы с готовыми решениями:

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

Циклический сдвиг массива без использования вспомогательного массива
Ребят, помогите пожадуйста написать лабу...Времени ктастрофически не хватает, буду очень...

Сдвиг элемента массива в конец этого массива
В общем, такая вот проблема появилась. Задача: если элемент массива содержит в своей записи цифру...

Удаление элемента из массива и сдвиг массива
Нужно удалить максимальный элемент массива и сделать сдвиг массива на одну позицию. Нужно сделать...

5
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
12.10.2017, 20:31 2
Цитата Сообщение от Avaddon74 Посмотреть сообщение
например влево,
- а по-моему, получается как раз вправо.
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
12.10.2017, 20:36 3
Цитата Сообщение от Avaddon74 Посмотреть сообщение
чтобы элемент 0-го индекса сдвигался в 1-ый, 1 во второй и т.д.
Это вправо!
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Я делаю так:
Это вниз!


А вот так циклически вправо:
C++
1
2
3
4
5
6
7
8
9
10
myClass tmp;
for (int i = 0; i < 5; i++) 
{
    tmp = obj[i][4];
    for (int j = 4; j > 0; j--) 
    {
        obj[i][j] = obj[i][j-1];
    }
    obj[i][0] = tmp;
}
0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
12.10.2017, 20:56  [ТС] 4
Цитата Сообщение от Catstail Посмотреть сообщение
а по-моему, получается как раз вправо
Не суть , сам массив сдвигается вправо, а движение относительно массива влево... В общем проехали, суть не в слове )

Добавлено через 6 минут
В общем вроде решил, я пошел по другому пути, я решил, что копирование класса не правильно, лучше оперировать указателями, и переписал создание массива на:
C++
1
2
3
4
5
6
7
8
myClass ***obj;
obj = new myClass **[5];
for (int x(0); x < 5; x++) {
    obj[x] = new myClass *[5];
    for (int z(0); z < 5; z++) {
        obj[x][z] = new myClass ();
    }
}
Вроде заработало
0
243 / 268 / 219
Регистрация: 14.11.2016
Сообщений: 1,043
12.10.2017, 21:11 5
Avaddon74, функцию сдвига LeftShift можешь к себе в проект вставить, она шаблонная
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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <ctime>
#include <cstdlib>
 
void Print(const int**, const std::size_t&, const std::size_t&, const char*);
template<class T> void LeftShift(T**, const std::size_t&, const std::size_t&, const std::size_t&);
void FillMatrix(int**, const std::size_t&, const std::size_t&);
 
int main()
{
    std::srand(unsigned(std::time(NULL)));
    const std::size_t ROWS(5U);
    const std::size_t COLS(5U);
    int **matrix = new int*[ROWS];
    for (std::size_t i(0U); i < ROWS; matrix[i++] = new int[COLS]);
 
    FillMatrix(matrix, ROWS, COLS);
    Print((const int**)matrix, ROWS, COLS, "After: \n");
    LeftShift<int>(matrix, ROWS, COLS, 4U);
    Print((const int**)matrix, ROWS, COLS, "Before: \n");
 
    for (std::size_t i(0U); i < ROWS; delete[] matrix[i++]);
    delete[] matrix;
}
 
void Print(const int **matrix, const std::size_t &rows,
    const std::size_t &cols, const char *str)
{
    std::cout << str;
    std::for_each(matrix, matrix + rows, [&cols](const int *line)
    {
        std::copy(line, line + cols, std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
    });
    std::cout << std::endl;
}
 
template<class T>
void LeftShift(T **matrix, const std::size_t &rows,
    const std::size_t &cols, const std::size_t &num) // num - кол-во сдвигов влево
{
    for (std::size_t k(0U); k < num; ++k)
    {
        T temp(**matrix);
        for (std::size_t i(0U); i < rows; ++i)
        {
            for (std::size_t j(0U); j < cols; ++j)
            {
                if (j < cols - 1U)
                {
                    matrix[i][j] = matrix[i][j + 1U];
                }
                else // Если это последний элемент в строке...
                {
                    if ((i + 1U) < rows) // Если есть ниже строка...
                    {
                        matrix[i][j] = *(matrix[i + 1]); // Берем первый элемент (i + 1) строки и приравниваем последнему i строки
                    }
                    break;
                }
            }
        }
        matrix[rows - 1U][cols - 1U] = temp;
    }
}
 
void FillMatrix(int **matrix, const std::size_t &rows, const std::size_t &cols)
{
    auto GetRandomValue = [](void) -> int { return std::rand() % 100; };
    std::for_each(matrix, matrix + rows,
        [&cols, &GetRandomValue](int *line)
    {
        std::generate(line, line + cols, GetRandomValue);
    });
}
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
13.10.2017, 11:10 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
class myClass  // модельный класс
{
 public:
 int z; // метка
};             
 
using namespace std;
 
int main(int argc, char *argv[])
{
    int i,j;
    myClass **obj;
 
    // Создание массива объектов
 
    obj = new myClass* [5];
    
    for (i=0; i < 5; i++) 
    {
          obj[i] = new myClass[5]; 
          for (j=0; j<5; j++)
              obj[i][j].z=i+j; // запись метки
    }          
              
    // Исходная печать          
              
    for (i=0; i<5; i++)
    {
        for (j=0; j<5; j++) cout << obj[i][j].z << " ";
        cout << endl;
    }
 
    cout << endl << endl;
 
    // Сдвиг каждой строки влево
    
    for (i=0; i<5; i++)
        for (j=0; j<4; j++) obj[i][j]=obj[i][j+1];
 
    // Печать сдвинутого
        
    for (i=0; i<5; i++)
    {
        for (j=0; j<4; j++) cout << obj[i][j].z << " ";
        cout << endl;
    }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}




Код
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8


1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
Для продолжения нажмите любую клавишу . . .
0
13.10.2017, 11:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2017, 11:10
Помогаю со студенческими работами здесь

Сдвиг массива
Задача: программа должна находить последний отрицательный элемент в массиве и заменять его на 3...

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

Сдвиг массива
Дан массив a из n элементов. Создайте массив размером n × n, первая строка которого представляет...

Сдвиг элементов массива
Даны действительные числа m1,m2,...m20. Получить m20,m19,...m11,m1,m2,...m10. Помогите решить


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru