Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2011, 16:45   #11
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
KillJoy

дан массив размером N.Подсчитать максимальное количество подряд идущих элементов, каждый из которых больше предыдущего.

что-то типа того...

Код:
#include <algorithm>
#include <functional>

#include <iterator>
#include <iostream>

#include <locale>

template <typename T, typename U>
void find(const T* arr, const size_t N, U u)
{
	typedef typename std::allocator<T>::const_pointer iterator;
	typedef typename std::iterator_traits<iterator>::difference_type difference_type;

	iterator curr = &arr[0], next, found = arr + N;
	difference_type max_seq = 0;

	for ( ; (next = std::adjacent_find(curr, arr+N, u)) != arr+N; curr = ++next)
	{
		const difference_type curr_length = std::distance(curr, next) + 1;
		if (curr_length > max_seq)
		{ max_seq = curr_length; found = curr; }
	}

	const difference_type last_length = std::distance(curr, next);
	if (last_length > max_seq)
	{ max_seq = last_length; found = curr; }

	std::cout << "Самая длинная последовательность:" << std::endl;
	std::copy(found, found + max_seq, std::ostream_iterator<T>(std::cout, " "));
}

int main()
{
	setlocale(LC_ALL, "");

	int arr[] = {
		1,2,
		1,2,3,
		1,2,3,4,5,
		-1,0,1,
		6,7,8,9,10,
		1,
		0,1,2,3,4,5,
		1,2,
	};

	find(arr, sizeof(arr)/sizeof(arr[0]), std::greater<int>());

	return 0;
}
Пример работы программы: http://liveworkspace.org/code/8c01ff...3af3a5c5102826
Просто ужасный код вы привели! То есть это пример того, как не надо писать функции!

Разберем по порядку ваш пример. Во-первых, вы даете название функции, совпадающее с названием стандартного алгоритма, чего, очевидно, делать не следует.
Во-вторых, требуется, чтобы функция вызвращала значение, равное максимальному числу следующих в возрастающем порядке элементов. У вас же функция возвращает void. То есть ее объявление не соответсвует ее назначению.

Далее, что еще хуже, у вас рассогласованность между типом первого параметра и типом третьего параметра для инстанцинирования третьего параметар. Всю информацию о типе элементов данных хранит в себе сам массив. То есть для того, чтобы использовать функционал greater, достаточно знать тип элемента массива.

Далее, получить информацию о типе элементов массива и о типе расстояния между итераторами, лучше использовать стандартный метод, то есть использовать

std::iterator_traits<T>

Кстати сказать, в функции параметры следует определять в соответсвии с общепринятым для стандартных аргументов, то есть указывать начальный и конечный итератор.
В своей функции вы используете итераторы произвольного доступа, тем самым резко сужаете возможность вашей функции, так как, например, для работы стандартного алгоритма std::adjacent_find на самом деле можно использовать последовательные итераторы.

Далее вы просто не то делаете, что требуется.

Код:
const difference_type curr_length = std::distance(curr, next) + 1;
if (curr_length > max_seq)
{ max_seq = curr_length; found = curr; }
Допустим, были найдены смежные элементы. Вы должны подсчитать расзмер последовательности смежных элементов, а вы подсчитываете расстояние от начала массива до первого смежного элемента. А это не одно и тоже!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 06.07.2011, 17:54   #12
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Так просто, делать было нечего

#include <iostream>
#include <time.h>

Код:
inline int *AllocMem(int *Arr, int Size) {
 return (Arr = new int[Size]);
}

int TrackArr(int *Arr, int Size) {
 int Sequence = 0; int Temp = 0;
 for (int i = 1; i < Size; ++i) {
  if (Arr[i] > Arr[i - 1]) {
   ++Sequence;
  }
  else {
   if (Sequence > Temp)
    Temp = Sequence;
   else
    Sequence = 0;
  }
 }
 return Temp;
}

int *SetArr(int *Arr, int Size)
{
 srand(time(0));
 for (int i = 0; i < Size; ++i) {
  Arr[i] = 1 * rand() % 100;
 }
 return Arr;
}

void GetArr(int *Arr, int Size) {
 for (int i = 0; i < Size; ++i) {
  std::cout << "[" << Arr[i] << "]";
 }
}

int main()
{
 int *Arr; int Size = 50;
 Arr = AllocMem(Arr, Size);
 SetArr(Arr, Size);
 std::cout << TrackArr(Arr, Size) << std::endl;
 GetArr(Arr, Size);
 delete Arr;
 std::cin.get();
 return 0;
}
Результат: http://liveworkspace.org/code/90060c...0aec0bf33f0abb

// Поправил

Последний раз редактировалось coNsept; 06.07.2011 в 19:38.
coNsept вне форума Ответить с цитированием
Старый 06.07.2011, 18:05   #13
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

coNseptб
У вас программа делает не то, что требуется, то есть она не ищет максимальную последовательность возрастающих элементов, а просто подсчитывает число возрастающих элементов в последовательности.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 06.07.2011, 19:58   #14
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Подозреваю, что там подразумевался int.
_-Re@l-_ вне форума Ответить с цитированием
Старый 07.07.2011, 18:22   #15
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Вообще, если не писать собственные вспомогательные алгоритмы, то данная очень простая задача, как говорится, "не по зубам" стандартным алгоритмам! По крайней мере лично я не знаю, как ее решить только с помощью стандартных алгоритмов.
Если у кого есть какие-то возражения, то было бы интересно их услышать.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задан вектор X[20]. Положительные числа переписать в массив Y, а отрицательные в массив W leha_demi Помощь студентам 2 24.09.2011 18:12
Запись координат в массив в реал тайм, Как записать координаты в массив Dark19 Visual C++ 2 21.06.2011 18:45
Из массив А получить массив В, удвоив все нечётные элементы удвоены ( на Pascal) KARTER Помощь студентам 1 18.06.2011 19:58
Массив - Нужно написать массив и распечатать на экран с конца в начало(язык С++) econ Помощь студентам 1 29.05.2011 22:02
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06