Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Массивы и указатели


Автор: insi 14.5.2008, 19:40
Одномерный массив целых чисел, размер которго задается с клавиатуры. Запрограммировать следующие действия с массивом:
   1. циклически сдвигать на К позиций влево;
   2. выяснить, упорядочены ли элементы массива по невозрастанию или неубыванию;
   3. если в исходном массиве количество положительных значений меньше, чем отрицательных, то создавать новый массив для отрицательных значений, в противном случае - создавать массив для положительных значений и переписывать в него соответствующие значения исходного массива.
 
В приложении необходимо:
1. Для временного хранения наборов значений использовать только временные динамические массивы;
2. Программирование заданных действий производить с использованием указателей;
3. Вывод результатов оформлять в виде таблицы;
4. Создать пользовательсике функции;
5. В приложении необходимо обеспечить возможность выбора конкретного действия;
6. В приложении необходимо обеспечить возможность  повторного выполнения задания без перезапуска приложения;

Автор: archimed7592 14.5.2008, 19:42
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Rififi 15.5.2008, 13:07
insi, 
Цитата(insi @  14.5.2008,  19:40 Найти цитируемый пост)
1. циклически сдвигать на К позиций влево;
Код
// arr = указатель на первый элемент массива
// N = количество элементов в массиве
// shift = куда и на сколько двигать
// проверки на валидность отсутствуют
template <typename T>
void rotate(T* arr, size_t N, typename std::iterator_traits<T>::difference_type shift)
{
    if (shift < 0)
        shift = N+shift;
    std::rotate(arr, arr+shift, arr+N);
}


Цитата(insi @  14.5.2008,  19:40 Найти цитируемый пост)
 2. выяснить, упорядочены ли элементы массива по невозрастанию или неубыванию;
Код
// Невозрастающая
template <typename T>
bool nonincreasing(T* arr, size_t N)
{
    return std::adjacent_find(arr, arr+N, std::less<T>()) == arr+N;
}

// Неубывающпя
template <typename T>
bool nondecreasing(T* arr, size_t N)
{
    return std::adjacent_find(arr, arr+N, std::greater<T>()) == arr+N;
}


Цитата(insi @  14.5.2008,  19:40 Найти цитируемый пост)
3. если в исходном массиве количество положительных значений меньше, чем отрицательных,

Подсчёт количества потрицательных и положительных элементов
В зависимости от полученного результата делаешь то что нужно.
Код
// двойной проход, но оптимизировать лень
template <typename T>
std::pair<size_t, size_t> posneg_count(T* arr, size_t N)
{
    return std::make_pair(
        std::count_if(arr, arr+N, std::bind2nd(std::less<T>(), 0)),
        std::count_if(arr, arr+N, std::bind2nd(std::greater<T>(), 0))
        );
}

Автор: insi 15.5.2008, 23:29
Rififi,  огромное вам спасибо, вы мне очень помогли! Только вот не могли бы вы пояснить, что такое проверка на валидность?  smile 

Автор: insi 22.5.2008, 22:41
И все же может кто-то знает как ее можно проще решить, без stl ?  smile 

Автор: Rififi 22.5.2008, 23:39
Цитата(insi @  15.5.2008,  23:29 Найти цитируемый пост)
Только вот не могли бы вы пояснить, что такое проверка на валидность?

это означает проверку входных параметров на допустимые значения.
например в функцию rotate можно передать arr = NULL, или N = -1000000, и тогда она завершится аварийно.

Автор: insi 26.5.2008, 21:25
А можно это как-то расписать более простым кодом?  

Автор: insi 28.5.2008, 22:52
Или может кто-то знает как оптимизировать данный код? smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)