На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (5) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> Срочно нужна помощь. , Задачка на c++
    Очень срочно нужна помощь. Помогите плз. Необходимо написать программку, которая генерирует массив и преобразует его так, чтобы сначала шли нулевые элементы, а затем все остальные.
      Вот еще в копилку:
      ExpandedWrap disabled
        #include <iostream>
        #include <iterator>
        #include <vector>
        #include <algorithm>
         
        int main()
        {
            int item = 5;
            std::vector<int> iArray;
            std::generate_n(std::back_inserter(iArray), 10, [&item]() { return (item == 0) ? item : item--; });
            std::cout << "Array is: " << std::endl;
            std::copy(iArray.begin(), iArray.end(), std::ostream_iterator<int>(std::cout, " "));
            std::sort(iArray.begin(), iArray.end());
            std::cout << "\nSorted array is: " << std::endl;
            std::copy(iArray.begin(), iArray.end(), std::ostream_iterator<int>(std::cout, " "));
         
            return 0;
        }
        ExpandedWrap disabled
          #include <algorithm>
          #include <vector>
          #include <cstdlib>
           
          int main()
          {
              std::vector<int> v(30);
              std::generate(v.begin(), v.end(), [](){return (std::rand() % 10);});
              size_t idx = v.size();
              for(auto it = v.rbegin(); it != v.rend(); it++)
                  if(*it != 0)
                      v[--idx] = *it;
              std::fill(v.begin(), v.begin() + idx, 0);
              return 0;
          }


        Добавлено
        Цитата KILLER @
        Вот еще в копилку:

        У тебя перемешивается порядок ненулевых элементов.
        Сообщение отредактировано: shm -
          Цитата shm @
          У тебя перемешивается порядок ненулевых элементов.

          Ну да, в условии сказано было, чтоб сначало шли нулевые, потом все остальные. Я подумал, что раз в условии не сказано, что порядок остальных элементов должен сохранится, то можно натравить обычную сортировку на массив. Возможно я не так условие понял :-?
            Цитата KILLER @
            Ну да, в условии сказано было, чтоб сначало шли нулевые, потом все остальные.

            Тебе бы добавить в сортировку - лямбду, которая будет сравнивать отрицательные элементы с нулем.
            Иначе, в случае наличия отрицательных элементов - нули не будут впереди.
              Цитата JoeUser @
              Тебе бы добавить в сортировку - лямбду, которая будет сравнивать отрицательные элементы с нулем.
              Иначе, в случае наличия отрицательных элементов - нули не будут впереди.

              Да там просто лень было писать цикл, а хотелось чтоб массив был сразу сгенерирован с разными числами, среди которых есть нули. Поэтому написал там такую проверку. Ессно автор может под себя переделать как ему нужно, и проверки повставлять. Я то выкладывал с целью показать саму идею. :-?
                Цитата KILLER @
                Да там просто лень было писать цикл, а хотелось чтоб массив был сразу сгенерирован с разными числами, среди которых есть нули. Поэтому написал там такую проверку. Ессно автор может под себя переделать как ему нужно, и проверки повставлять. Я то выкладывал с целью показать саму идею.

                Идея хорошая - циклы не нужны.
                Вот на основе твоего кода:

                ExpandedWrap disabled
                  #include <iostream>
                  #include <iterator>
                  #include <vector>
                  #include <algorithm>
                   
                  int main() {
                    int item = 10;
                    std::vector<int> iArray;
                    std::generate_n(std::back_inserter(iArray), item , [] () -> int {
                      int tmp = std::rand() % 10;
                      return (std::rand() % 10 > 5) ? tmp : -tmp;
                    });
                    std::cout << "Array is: " << std::endl;
                    std::copy(iArray.begin(), iArray.end(), std::ostream_iterator<int>(std::cout, " "));
                    std::sort(iArray.begin(), iArray.end(), [](const auto &a, const auto &b) -> bool {
                      if (a == 0) return true;
                      return a < b;
                    });
                    std::cout << "\nSorted array is: " << std::endl;
                    std::copy(iArray.begin(), iArray.end(), std::ostream_iterator<int>(std::cout, " "));
                    return 0;
                  }
                  Преподы ваш код не оценят :lool: + коллекции вряд ли можно называть "массивами"
                  + в задании не было сказано что элементы массива не являются комплексным числом. Можно тогда уже, заюзать список классов, внутри которых будут мультикомплексные гиперкомплексные числа, и уже если их действительные части равны 0 (но, не факт что имелось ввиду это), то выталкивать такие числа в начало списка
                  Сообщение отредактировано: VisualProg -
                    Цитата VisualProg @
                    Преподы ваш код не оценят :lool:

                    Да ладно, сразу автомат поставят 8-)

                    Добавлено
                    Цитата VisualProg @
                    + коллекции вряд ли можно называть "массивами"

                    Ну можно вместо вектора взять std::array, хотя std::vector - самый что ни на есть массив, по стандарту. Правда динамический. Но в задании ничего не было сказано о том, каким он должен быть. :-?
                    Сообщение отредактировано: KILLER -
                      Цитата KILLER @
                      сразу автомат поставят 8-)

                      Мне бы таких преподавателей) Я бы сказал что большинство из преподавателей такой код не осилят...

                      Кстати, почему именно так?
                      Цитата JoeUser @
                      std::generate_n(std::back_inserter(iArray), item , [] () -> int {
                      int tmp = std::rand() % 10;
                      return (std::rand() % 10 > 5) ? tmp : -tmp;
                      });


                      Разве не проще в одно действие сделать?
                      ExpandedWrap disabled
                          std::generate_n(std::back_inserter(iArray), item , [] () -> int {
                            return (std::rand() % 21) - 10;
                          });
                      Сообщение отредактировано: VisualProg -
                        Цитата VisualProg @
                        Разве не проще в одно действие сделать?

                        Да, так лучше.
                          Цитата JoeUser @
                          [](const auto &a, const auto &b) -> bool {
                          if (a == 0) return true;
                          return a < b;
                          }

                          По-моему тут будет фигня если будут сравниваться два нуля - получится, что одновременно a < b и b < a.
                            Кстати что-то я тупанул, можно сделать проще:
                            ExpandedWrap disabled
                              #include <algorithm>
                              #include <vector>
                              #include <cstdlib>
                               
                              int main() {
                                  std::vector<int> v(30);
                                  std::generate(v.begin(), v.end(), [](){return (std::rand() % 10);});
                                  std::fill(std::remove(v.rbegin(), v.rend(), 0), v.rend(), 0);
                                  return 0;
                              }
                              Цитата OpenGL @
                              По-моему тут будет

                              Одновременно не будут. Сработает либо первый, либо второй ретурн.
                                Цитата JoeUser @
                                Одновременно не будут. Сработает либо первый, либо второй ретурн.

                                Причём тут первый либо второй?
                                ExpandedWrap disabled
                                  int a = 0;
                                  int b = 0;
                                  auto cmp = [](const auto &a, const auto &b) -> bool {
                                  if (a == 0) return true;
                                  return a < b;
                                  };
                                  std::cout << cmp(a, b) << " " << cmp(b, a); // Выводит два раза true

                                что для сортировки, очевидно, плохо.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0515 ]   [ 17 queries used ]   [ Generated: 20.04.24, 03:22 GMT ]