Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Geniis
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 44
#1

Сортировка по убыванию элементов массива, расположенных до первого отрицательного элемента - C++

28.02.2015, 07:09. Просмотров 609. Ответов 11
Метки нет (Все метки)

Отсортировать в порядке убывания элементы массива Е(46), расположенные до первого отрицательного его элемента.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2015, 07:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка по убыванию элементов массива, расположенных до первого отрицательного элемента (C++):

Найти произведение и количество элементов массива, расположенных до первого отрицательного элемента - C++
окунулся в с++ буквально неделю назад и много ещё не понимаю. может кто помочь. вообщем необходимо найти произведение и количество...

Найти произведение и количество элементов массива, расположенных до первого отрицательного элемента - C++
Народ помогите построить программу Задание такое: Найти произведение и количество элементов массива, расположенных до первого...

Найти сумму модулей элементов массива, расположенных после первого отрицательного элемента - C++
Найти сумму модулей элементов массива, расположенных после первого отрицательного элемента. Вот код: #include <conio.h> #include...

Найти сумму модулей элементов массива, расположенных после первого отрицательного элемента - C++
В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) номер минимального по модулю элемента массива; 2) сумму...

Найти сумму элементов, расположенных до первого отрицательного элемента - C++
Дан массив − 19 элементов целого типа. Найти сумму элементов, распо- ложенных до первого отрицательного элемента. Если отрицательных ...

Вычислить номер минимального по модулю элемента и сумму модулей элементов, расположенных после первого отрицательного - C++
Добрый день. Прошу Вашей помощи. В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) номер минимального по...

11
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
28.02.2015, 08:34 #2
Geniis, Извольте:
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
#include <iostream>
#include <algorithm>
 
template <typename C>
void ShowElement(C const& elements) {
  for (const auto& element : elements) {
    std::cout << element << " ";
  }
  std::cout << '\n';
}
 
struct IsNegative {
  template <typename T>
  bool operator()(T const& value) {
    return value < 0;
  }
};
 
struct Greater {
  template <class T>
  bool operator()(T const& a, T const& b) const {
    return a > b;
  }
};
 
template <typename C>
void SortElementsInDescendingOrderBeforeFirstNegativeElement(C& elements) {
  auto first_negative =
      std::find_if(std::begin(elements), std::end(elements), IsNegative());
  std::sort(std::begin(elements), first_negative, Greater());
}
 
int main() {
  std::vector<int> elements = {4, 7, 3, 4, 5, -2, 1, 0, -1, 8, 9};
  std::cout << "Elements before sort:\n";
  ShowElement(elements);
  SortElementsInDescendingOrderBeforeFirstNegativeElement(elements);
  std::cout << "Elements after sort:\n";
  ShowElement(elements);
}
Пруф работоспособности:
http://ideone.com/6sw8OO
1
zss
Модератор
Эксперт С++
6629 / 6191 / 2048
Регистрация: 18.12.2011
Сообщений: 16,146
Завершенные тесты: 1
28.02.2015, 12:08 #3
Melg, Чуть подправил Ваш код с использованием функциональных адаптеров и под VS 2008
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
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector> 
#include <iterator>
using namespace std;
template <typename C,typename VAL>
void ShowElement(const C elements) 
{
  ostream_iterator<VAL> out(cout," ");
  copy(elements.begin(),elements.end(),out);
  cout << endl;
}
 
template <typename C,typename T>
void SortElementsInDescendingOrderBeforeFirstNegativeElement(C& elements) 
{
    C::iterator first_negative =
    find_if(elements.begin(), elements.end(), bind2nd(less<T>(),0));
    sort(elements.begin(), first_negative, greater<T>());
}
 
int main() 
{
  vector<int> v;
  int elements[] = {4, 7, 3, 4, 5, -2, 1, 0, -1, 8, 9};
  for(int i=0;i<sizeof(elements)/sizeof(int);++i)
      v.push_back(elements[i]);
  cout << "Elements before sort:\n";
  ShowElement<vector<int>,int>(v);
  SortElementsInDescendingOrderBeforeFirstNegativeElement<vector<int>,int>(v);
  cout << "Elements after sort:\n";
  ShowElement<vector<int>,int>(v);
  system("pause");
  return 0;
}
0
Dimension
Dimension
571 / 440 / 135
Регистрация: 08.04.2014
Сообщений: 1,709
Завершенные тесты: 1
28.02.2015, 12:41 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <functional>
#include <algorithm>
using namespace std;
int main(){
    int e[46], index = -1,f=1;
    for (int i = 0; i < 46; i++){
        cin >> e[i];
        if (e[i] < 0 && f){
            index = i; f = 0;
        }
    }
    if (!f)sort(e, e + index,greater<int>());
    for (int i = 0; i < 46; i++)cout << e[i] << ' ';
    return 0;
}
0
Geniis
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 44
14.03.2015, 17:54  [ТС] #5
Программы сильно мудренные, да и Dev не берет их. Можно проше чуть чуть, а то я даже не знаю таких функций
0
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 236
14.03.2015, 22:50 #6
А пузырек не проходили что ли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include"iostream"
using namespace std;
 
int main()
{
    const int SIZE = 5;
    int E[SIZE] = {1,2,-3,4,5};
 
    for(int i = 0; i < SIZE; ++i) {
        if(E[i] < 0) break;
 
        for(int j = 0; j < SIZE; ++j) {
            if(E[j] < 0) break;
            if(E[i] > E[j]) swap(E[i], E[j]);
        }
    }
 
    for(int i = 0; i < SIZE; ++i)
        cout << E[i] << " ";
 
        return 0;
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
14.03.2015, 23:18 #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
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>
 
int main()
{
    const size_t N = 46;
    int E[N];
    std::mt19937 gen { std::random_device()() };
    std::uniform_int_distribution<> dist(-5, 50);
    auto print = [](const int *arr, const size_t size)
    {
        std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
    };
 
    std::generate(E, E + N, [&gen, &dist] { return dist(gen); });
    std::cout << "Before:\n";
    print(E, N);
 
    auto it = std::find_if(E, E + N, [](const int x) { return x < 0; });
    std::sort(E, it, std::greater<int>());
    std::cout << "\nAfter:\n";
    print(E, N);
}
Добавлено через 2 минуты
Melg, почему игнорируете лямбды при наличии C++11?

Добавлено через 2 минуты
zss, 18 строка
C++
1
typename C::iterator first_negative =
Добавлено через 1 минуту
zss, а ещё так вот:
C++
1
2
3
4
template <typename C>
void ShowElement(const C elements)
{
  ostream_iterator<typename C::value_type> out(cout," ");
И можно вызывать уже без указания типа
C++
1
ShowElement(v);
1
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
15.03.2015, 06:48 #8
MrGluck, А где Вы предлагаете использовать лямбды? Если вместо предикатов Greater и IsNegative, то на мой взгляд это бы ухудшило читаемость куска кода, который связан непосредственно с операцией, которую хотел увидеть топикстартер - а именно
отсортировать порядке убывания элементы массива, расположенные до первого отрицательного его элемента
. Поскольку код реализации того как именно находятся элементы меньше нуля, и код запуска сортировки в обратном порядке (деталь реализации) была бы представлена в более высокоуровневом алгоритме. Кроме того, эти предикаты могли бы войти в библиотеку повторно используемого кода, поскольку написаны в обобщенном виде. Наконец, предикаты выделенные в отдельные классы можно было бы протестировать на корректность не зависимо от места их использования.

Сравните читаемость строк:
C++
1
auto first_negative = std::find_if(std::begin(elements), std::end(elements), IsNegative());
и
C++
1
auto it = std::find_if(E, E + N, [](const int x) { return x < 0; });
Мой вариант скрывает как алгоритм нахождения, так и тип данных, получаемый из контейнера. Оставляя словесное описание.
Если у Вас есть аргументы в пользу лямбд и Вы считаете, что детали реализации, представляемые лямбдой принципиально важно увидеть в месте вызова find_if-а я буду рад выслушать Ваши доводы.
0
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 236
15.03.2015, 14:31 #9
Мне лямбду проще прочитать. Если бы условие было реально мудреное тогда можно вынести в функцию.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
15.03.2015, 17:04 #10
Цитата Сообщение от Melg Посмотреть сообщение
MrGluck, А где Вы предлагаете использовать лямбды? Если вместо предикатов Greater и IsNegative
Я там и предполагал. На самом деле, это не указание на ошибку или недочёт, мне интересно узнать причину, ваше ИМХО.

Теперь объясню почему я считаю лямбды более подходящими под данный вариант.
Так как это простенькое задание, то оно явно не предполагает повторное использование кода. Вы ведь не стали выносить в хедер функторы. Плюс к тому, они используются лишь в одном конкретном месте. А значит, не зачем плодить сущности (бритва Оккама). В дополнение, скажу что лямбды состоят не только из одной строчки (Ван Россум одобряет) - они состоят из простой бинарной операции над двумя переменными. Следовательно, их инлайн не сильно скажется на читаемости или разбухании инструкции. Зато мы получим логику предиката прям на месте с алгоритмом, то есть избавимся от размазывания по всему исходнику. По поводу шаблонизации - использование алгоритма для разных типов не предполагалось, так что не считаю отсутствие шаблонов критичным, скорее наоборот.

То есть функторы это хорошо, если выполняется хотя бы один из пунктов:
1. Один и тот же алгоритм используется в нескольких (2+) местах.
2. Тело функтора длинное и содержит несколько инструкций (хотя бывает что и это не так важно).
3. Предполагается повторное использование функтора в составе библиотеки.
4. Его использование сильно улучшит читаемость.
5. Необходимо дать логическое объяснение происходящему в его теле (хорошее имя прояснит непонятную логику).
Ни один из пунктов не выполняется, следовательно инлайновая лямбда имеет только плюсы.
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
15.03.2015, 17:56 #11
MrGluck, я с Вами согласен во всем, за исключением, пожалуй педагогической составляющей в наших ответах на вопросы с форума. Просто если очень часто решать маленькие задачки, которые нужно сделать здесь и сейчас, спрашивать на форуме совета - и получать в ответ такие же решения "для сей минуты я пишу" от других пользователей, то у человека создается вполне определенная картина мира. И что мы получаем на выходе? Либо несколько месяцев агонии, когда человек выходит на работу программистом и "все делает не так" - а его за это шпыняют старшие товарищи. Либо, мы получаем целый коллектив "молодых и перспективных" специалистов, которые напрочь не способны даже мыслить в контексте повторного использования, выразительности кода, избавления от дублирования и, какого уж там, тестирования. И вариться такой коллектив в собственном чудесном вымысле может достаточно долго. Поэтому я считаю, даже если это может выглядеть несколько громоздким и надуманным - показывать не только программки, состоящие из мейна и с 0-вым процентом для возможности повторного использования.
0
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 236
15.03.2015, 18:17 #12
хехе, я вот типо этот начинающий программист. Сижу тут скилл поднимаю. А что ты предлагаешь?
Тут язык толком не знают, не говоря об STL. А писать по несколько вариантов лень.
Ещё я не видел чтобы исключения обрабатывали здесь.
0
15.03.2015, 18:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2015, 18:17
Привет! Вот еще темы с ответами:

Определить сумму и количество элементов массива, расположенных до первого отрицательного числа - C++
Ввести целочисленный массив, состоящий из 10 элементов. определить сумму и количество элементов, расположенных до первого отрицательного...

Вычислить сумму элементов массива, расположенных после последнего отрицательного элемента - C++
необходимо помочь в одномерных числовых массивах. сам начал работу, но в дальнейшем не могу справиться! кину само задание и текст кода: ...

Найти произведение элементов массива до первого не отрицательного элемента - C++
Дан массив из 1000 случайных целых чисел в диапазоне от от -5 до 2,найти произведение элементов до первого не отрицательного элемента .Как...

Вычислить сумму целых частей элементов массива, расположенных после последнего отрицательного элемента - C++
Вычислить сумму целых частей элементов массива, расположенных после последнего отрицательного элемента.


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.