9 / 9 / 7
Регистрация: 20.05.2012
Сообщений: 101
1

Сдвиг элементов одномерного массива по условию

11.01.2014, 20:18. Показов 606. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть функция, она считает количество нулевых элементов (counter) и удаляет его (нулевой элемент). Работает вроде бы правильно, но сдвиг работает неправильно. Подскажите, как исправить?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int *ZeroElementsCounter(int* _array, int n)
{
    int counter = 0, i, k;
    for (i = 0; i < n; i++)
    {
        if (_array[i] == 0)
        {
                _array[i] = _array[i + 1];
                n--;
                counter++;
        }
    }
    return _array;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2014, 20:18
Ответы с готовыми решениями:

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

Осуществить циклический сдвиг элементов одномерного массива на k позиций
работает правильно только если k=1 если больше то сдвиг делает правильно, но когда на место их...

Сдвиг элементов одномерного массива
Пожалуйста помогите! я в си новичек! в общем моя задача: дан одномерный массив.сдвинуть элементы...

Циклический сдвиг влево элементов одномерного массива
Нужны 2 программы: 1) Написать программу, содержащую процедуру, которая реализует циклический...

7
Эксперт С++
4726 / 2547 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.01.2014, 22:11 2
вот так попробуйте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int *ZeroElementsCounter(int* _array, int n)
{
    int counter = 0, i, k;
    for (i = 0; i < n; i++)
    {
        if (_array[i] == 0)
        {
            counter++;
            for(k=i; k<n-1; k++)
                _array[k] = _array[k + 1];
            n--;
            i--;                
        }
    }
    return _array;
}
1
128 / 125 / 39
Регистрация: 11.04.2010
Сообщений: 255
12.01.2014, 03:51 3
Лучше, наверное, без вложенного цикла

C++
1
2
3
4
5
6
int k = 0;
 
for (int i = 0; i < n; i++) 
 { if (_array[i] != 0) _array[k++] = _array[i]; }
 
int counter = n - k;  // Количество нулевых элементов
1
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
12.01.2014, 05:08 4
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>
#include <algorithm>
#include <iterator>
#include <type_traits>
 
template<typename _Type, std::size_t _N>
std::size_t zero_elements_counter(_Type (&array)[_N])
{
    static_assert(std::is_arithmetic<_Type>::value,
                  "Array type must be arithmetic.");
 
    _Type *first = array,
        *last = array + _N,
        *dest = first;
 
    while (first != last)
    {
        if (*first) std::iter_swap(dest++, first++);
        else ++first;
    }
 
    return last - dest;
}
 
int main(int argc, char* argv[])
{
    int a[] = {1,2,3,4,0,1,2,3,4,0};
 
    std::cout << zero_elements_counter(a) << std::endl;
    for (auto e : a)
        std::cout << e << " ";
}
1
9 / 9 / 7
Регистрация: 20.05.2012
Сообщений: 101
12.01.2014, 09:32  [ТС] 5
При вводе n = 5;
Ввожу: 5 0 3 0 9
Вывод: 5 3 9 9 9

Как замененные элементы вообще убрать?
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
12.01.2014, 09:41 6
Harmonster,
Цитата Сообщение от outoftime Посмотреть сообщение
std::iter_swap(dest++, first++)
вы явно взяли не мой код.

Цитата Сообщение от Harmonster Посмотреть сообщение
Как замененные элементы вообще убрать?
перевыделить память под массив и вернуть ссылку на новый или использовать std::vector::resize на соответствующем объекте.
0
9 / 9 / 7
Регистрация: 20.05.2012
Сообщений: 101
12.01.2014, 10:11  [ТС] 7
Цитата Сообщение от outoftime Посмотреть сообщение
Harmonster,
вы явно взяли не мой код.


перевыделить память под массив и вернуть ссылку на новый или использовать std::vector::resize на соответствующем объекте.
Ну почему же? С вашим кодом вывод консоли (см. приложение). В начале массив из 10 элементов, и вывело массив из 10 элементов.
Миниатюры
Сдвиг элементов одномерного массива по условию  
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
12.01.2014, 11:25 8
Цитата Сообщение от Harmonster Посмотреть сообщение
При вводе n = 5;
Ввожу: 5 0 3 0 9
Вывод: 5 3 9 9 9
У меня нули отбрасываются в конец массива. Возможность обрезать контейнер предоставляю вам. На вопросы отвечу.

Добавлено через 1 минуту
Harmonster, P.S. для форматировая вывода из консоли используйте BB-код: [BASH] также как вы форматируете сишный код.

Добавлено через 1 минуту
К примеру:
Bash
1
2
3
4
5
D:\Projects\c++\help\help>g++ -Wall main.cpp -std=c++11
 
D:\Projects\c++\help\help>a.exe
2
1 2 3 4 1 2 3 4 0 0
Добавлено через 15 минут
Не подглядывать
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <type_traits>
 
template<typename _Type>
size_t zero_elements_counter(std::vector<_Type> &v)
{
    auto dest = v.begin();
    for (auto it = v.begin(); it != v.end(); ++it)
    {
        if (*it) *dest++ = *it;
    }
 
    size_t res = v.end() - dest;
    v.resize(std::distance(v.begin(), dest));
    return res;
}
 
int main(int argc, char* argv[])
{
    std::vector<int> a = {1,2,3,4,0,1,2,3,4,0};
 
    std::cout << zero_elements_counter(a) << std::endl;
    for (auto e : a)
        std::cout << e << " ";
}
Bash
1
2
3
4
5
D:\Projects\c++\help\help>g++ -Wall main.cpp -std=c++11
 
D:\Projects\c++\help\help>a.exe
2
1 2 3 4 1 2 3 4
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2014, 11:25
Помогаю со студенческими работами здесь

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

Циклический сдвиг влево элементов одномерного массива
2.Напишите процедуру, реализующую циклический сдвиг влево элементов одномерного массива на заданное...

Сдвиг элементов одномерного массива влево на две позиции
1. Сдвиг элементов одновременного массива влево на две позиции В данном программе сдвигает влево...

Осуществить циклический сдвиг элементов одномерного массива на k позиций.
Осуществить циклический сдвиг элементов одномерного массива на k позиций. помогите написать...

Циклический сдвиг влево на одну позицию элементов заданного одномерного массива
Помогите плиз. Разработать процедуру , которая осуществляет циклический сдвиг влево на одну...

Сортировка элементов одномерного массива по заданному условию
Помогите пожалуста!!!!!!!! Отрицательные элементы одномерного массива расположить в порядке...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru