distance
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Alex_999 я обычно по утрам за чашкой кофе проскакиваю галопом по европам по какой-нмбудь кинишке, но ладно уж, держи Код: #include <algorithm> #include <numeric> #include <iostream> #include <iterator> #include <locale> /* В одномерном массиве, состоящем из n вещественных элементов , вычислить: 1) количество отрицательных элементов массива; 2) сумму модулей элементов массива расположенных после минимального по модулю элемента. Заменить все отрицательные элементы массива их квадратами и упорядочить элементы массива по возрастанию. */ //------------------------------------------------------------------------------- // 1) количество отрицательных элементов массива; template <typename T> size_t count_negates(const T* arr, const size_t N) { return std::count_if(arr, arr+N, std::bind2nd(std::less<T>(), T())); } //------------------------------------------------------------------------------- // Вспомогательный класс-предикат для сравнения модулей чисел. template <typename T> struct abs_compare : public std::binary_function<T, T, T> { result_type operator()(const first_argument_type& v1, const second_argument_type& v2) const { return std::abs(v1) < std::abs(v2); } }; // 2) сумму модулей элементов массива расположенных после минимального по модулю элемента. template <typename T> T accumulate_after_min_mod(const T* arr, const size_t N) { typedef typename std::allocator<T>::const_pointer const_iterator; const_iterator it = std::min_element(arr, arr+N, abs_compare<T>()); if (it == arr+N) // если нечего подсчитывать возвращаем 0 return T(); return std::accumulate(it+1, arr+N, T()); } //------------------------------------------------------------------------------- // Вспомогательная функция делающая заданное преобразование массива. template <typename T, typename Pred, typename Func> T* transform_if(T* arr, const size_t N, T* dest, Pred pred, Func func) { T* last = arr+N; for( ; arr != last; arr++, dest++) { if (pred(*arr)) *dest = func(*arr); } return (dest); } // Вспомогательный класс-предикат для возведения числа в квадрат. template <typename T> struct square : public std::unary_function<T, T> { result_type operator()(const argument_type& v) const { return (v*v); } }; // Заменить все отрицательные элементы массива их квадратами и упорядочить элементы массива по возрастанию. template <typename T> void transform(T* arr, const size_t N) { // замена transform_if(arr, N, arr, std::bind2nd(std::less<T>(), T()), square<T>()); // упорядочение std::sort(arr, arr+N); } // Вывод массива на экран. template <typename T, typename O> void print_array(const T* arr, const size_t N, O& o) { std::copy(arr, arr+N, std::ostream_iterator<T>(o, " ")); std::cout << std::endl; } int main() { setlocale(LC_ALL, "Russian"); // Инициализация массива int arr[] = {...}; const size_t N = sizeof(arr) / sizeof(arr[0]); // Вывод на печать std::cout << "Исходный массив:" << std::endl; print_array(arr, N, std::cout); // Подсчет отрицательных элементов size_t negates = count_negates(arr, N); std::cout << "Количество отрицательных элементов: " << negates << std::endl; // Суммирование int sum = accumulate_after_min_mod(arr, N); std::cout << "Сумма модулей элементов массива после минимального по модулю элемента: " << sum << std::endl; transform(arr, N); std::cout << "Массив после преобразования:" << std::endl; print_array(arr, N, std::cout); return (0); } | пример вывода: Код: Исходный массив: 11 2 3 -5 -4 -3 9 8 7 -2 -1 -10 -6 Количество отрицательных элементов: 7 Сумма модулей элементов массива после минимального по модулю элемента: -16 Массив после преобразования: 1 2 3 4 7 8 9 9 11 16 25 36 100 |
|