Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.230.82] |
|
Страницы: (5) [1] 2 3 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Очень срочно нужна помощь. Помогите плз. Необходимо написать программку, которая генерирует массив и преобразует его так, чтобы сначала шли нулевые элементы, а затем все остальные.
|
Сообщ.
#2
,
|
|
|
Вот еще в копилку:
#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; } |
Сообщ.
#3
,
|
|
|
#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 @ Вот еще в копилку: У тебя перемешивается порядок ненулевых элементов. |
Сообщ.
#4
,
|
|
|
Цитата shm @ У тебя перемешивается порядок ненулевых элементов. Ну да, в условии сказано было, чтоб сначало шли нулевые, потом все остальные. Я подумал, что раз в условии не сказано, что порядок остальных элементов должен сохранится, то можно натравить обычную сортировку на массив. Возможно я не так условие понял |
Сообщ.
#5
,
|
|
|
Цитата KILLER @ Ну да, в условии сказано было, чтоб сначало шли нулевые, потом все остальные. Тебе бы добавить в сортировку - лямбду, которая будет сравнивать отрицательные элементы с нулем. Иначе, в случае наличия отрицательных элементов - нули не будут впереди. |
Сообщ.
#6
,
|
|
|
Цитата JoeUser @ Тебе бы добавить в сортировку - лямбду, которая будет сравнивать отрицательные элементы с нулем. Иначе, в случае наличия отрицательных элементов - нули не будут впереди. Да там просто лень было писать цикл, а хотелось чтоб массив был сразу сгенерирован с разными числами, среди которых есть нули. Поэтому написал там такую проверку. Ессно автор может под себя переделать как ему нужно, и проверки повставлять. Я то выкладывал с целью показать саму идею. |
Сообщ.
#7
,
|
|
|
Цитата KILLER @ Да там просто лень было писать цикл, а хотелось чтоб массив был сразу сгенерирован с разными числами, среди которых есть нули. Поэтому написал там такую проверку. Ессно автор может под себя переделать как ему нужно, и проверки повставлять. Я то выкладывал с целью показать саму идею. Идея хорошая - циклы не нужны. Вот на основе твоего кода: #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; } |
Сообщ.
#8
,
|
|
|
Преподы ваш код не оценят + коллекции вряд ли можно называть "массивами"
+ в задании не было сказано что элементы массива не являются комплексным числом. Можно тогда уже, заюзать список классов, внутри которых будут |
Сообщ.
#9
,
|
|
|
Цитата VisualProg @ Преподы ваш код не оценят Да ладно, сразу автомат поставят Добавлено Цитата VisualProg @ + коллекции вряд ли можно называть "массивами" Ну можно вместо вектора взять std::array, хотя std::vector - самый что ни на есть массив, по стандарту. Правда динамический. Но в задании ничего не было сказано о том, каким он должен быть. |
Сообщ.
#10
,
|
|
|
Цитата KILLER @ сразу автомат поставят Мне бы таких преподавателей) Я бы сказал что большинство из преподавателей такой код не осилят... Кстати, почему именно так? Цитата JoeUser @ std::generate_n(std::back_inserter(iArray), item , [] () -> int { int tmp = std::rand() % 10; return (std::rand() % 10 > 5) ? tmp : -tmp; }); Разве не проще в одно действие сделать? std::generate_n(std::back_inserter(iArray), item , [] () -> int { return (std::rand() % 21) - 10; }); |
Сообщ.
#11
,
|
|
|
Цитата VisualProg @ Разве не проще в одно действие сделать? Да, так лучше. |
Сообщ.
#12
,
|
|
|
Цитата JoeUser @ [](const auto &a, const auto &b) -> bool { if (a == 0) return true; return a < b; } По-моему тут будет фигня если будут сравниваться два нуля - получится, что одновременно a < b и b < a. |
Сообщ.
#13
,
|
|
|
Кстати что-то я тупанул, можно сделать проще:
#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; } |
Сообщ.
#14
,
|
|
|
Цитата OpenGL @ По-моему тут будет Одновременно не будут. Сработает либо первый, либо второй ретурн. |
Сообщ.
#15
,
|
|
|
Цитата JoeUser @ Одновременно не будут. Сработает либо первый, либо второй ретурн. Причём тут первый либо второй? 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 что для сортировки, очевидно, плохо. |