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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 12:42   #1
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию Заполнение массива со сдвигом вправо

Доброго времени суток. У меня такая задачка, нужно в массиве (arr[10]), держать всегда N самых свежих данных, устанавливая новое в начало. Например есть массив

= [1,2,3,4,5]

вводим любое число

= [3,1,2,3,4]

новое значение записывается в начало, а последнее число как бы вымещается
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле

Последний раз редактировалось DenProx; 05.05.2012 в 13:28.
DenProx вне форума Ответить с цитированием
Старый 05.05.2012, 12:59   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Потому что присвоение 0 элемента происходит в цикле.
Переместите строку с присвоением arr[0] = new; после цикла и будет все гут.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 05.05.2012, 13:02   #3
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

аааа)))))))) точно!!)) Спасибо!
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2012, 13:08   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Ну это скучно
Код:
#include <string.h>

typedef int TYPE;

void insertFirst( int value, TYPE * ar, int size)
{
	memmove(ar + 1, ar, sizeof(TYPE) * (size - 1));
	ar[0] = value;
}


int main()
{

	const int sz = 10;
	TYPE arr[sz];

	insertFirst(1, arr, sz);
	insertFirst(2, arr, sz);
	insertFirst(3, arr, sz);
	//....

	return 0;
}
EUGY вне форума Ответить с цитированием
Старый 05.05.2012, 13:19   #5
muradov
Пользователь
 
Регистрация: 05.05.2012
Сообщений: 39
Подмигивание

EUGY
Это не скучно, это просто неправильно

>> memmove(ar + 1, ar, sizeof(TYPE) * (size - 1));

будет данных на гигабайт, весь гиг двигать, если надо один элемент добавить?

Правильно будет держать индекс самого старого элемента в массиве и перезаписывать его новым.
muradov вне форума Ответить с цитированием
Старый 05.05.2012, 13:29   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

muradov массивы со списками не путай.
ТС нужна очередь в массиве.
EUGY вне форума Ответить с цитированием
Старый 05.05.2012, 13:32   #7
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

задачу немного подправил, более правильно условие звучит так: держать всегда в массиве N самых свежих данных, записывая новое значение в начало массива, а последнее выходит из него.
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2012, 13:32   #8
muradov
Пользователь
 
Регистрация: 05.05.2012
Сообщений: 39
Сообщение

Про списки не было разговора.
Да, что-то вроде очереди в массиве.
muradov вне форума Ответить с цитированием
Старый 05.05.2012, 13:38   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Ну конечно можно сделать интереснее.
Покажи.
EUGY вне форума Ответить с цитированием
Старый 05.05.2012, 13:53   #10
muradov
Пользователь
 
Регистрация: 05.05.2012
Сообщений: 39
По умолчанию

Пожалуйста.
Код:
template<typename T>
class NNewElements
{
private:
	T* _ptr;
	size_t _size;
	UINT _last;
	NNewElements & operator =(NNewElements const & elements);
	NNewElements(NNewElements const & elements);
public:
	NNewElements(size_t size) : _size(size), _last(0) { _ptr = new T[_size]; }
	~NNewElements(void) { delete [_size] _ptr; }
	void AddNew(T element)
	{
		_ptr[_last] = element;
		if (++_last == _size)
			_last = 0;
	}
};
Думаю, идея будет ясна

Последний раз редактировалось muradov; 05.05.2012 в 14:03. Причина: обрамил код
muradov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
заполнение массива на Си ддимочка Помощь студентам 3 02.09.2011 11:59
Сдвиг массива вправо на 1 элемент stas45rus Помощь студентам 2 30.08.2011 14:20
сдвиг массива вправо tem_80 Общие вопросы C/C++ 5 01.02.2011 15:21
Заполнение матрицы по спирали (от центра влево-вниз-вправо-вверх) Баур Помощь студентам 4 03.12.2009 17:39
Удаление элемента массива со сдвигом последующих beregok Общие вопросы C/C++ 11 09.01.2009 17:11