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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2013, 12:37   #1
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию Сдвиг элементов массива (C++)

Есть задание: сдвинуть элементы заданного массива на k позиций вправо (влево — если k отрицательное).

Моя текущая реализация:

Код:
#include <iostream>

using namespace std;

int main() {
    
	int n, k; cin >> n; // n - кол-во элементов массива; k - коэффициент сдвига
	
	int *a = new int[n]; int *b = new int[n]; // a - исходный массив; b - смещённый

	for(int i = 0; i < n; i++) { cin >> *(a+i); *(b+i) = 0; }
	
	cin >> k;

	for(int i = 0; i < n; i++) {

		*(b + (i+k) % n) = *(a + i % n); }

	for(int i = 0; i < n; i++) { cout << *(b+i) << " "; }

	return 0; 

}
Корректно работает для неотрицательных k.

При вводе отрицательного значения, некоторые значения остаются
неизменёнными. Например, при k = -1, один элемент (последний) остаётся
нулём; при k = -2 — два последних и т.д.

Подскажите, пожалуйста, каким образом можно реализовать эту программу
для всех случаев, чтобы она работала корректно? Заранее спасибо.
Nomicos вне форума Ответить с цитированием
Старый 24.01.2013, 12:42   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
сдвинуть элементы заданного массива на k позиций вправо
А на освободившихся местах что же должно остаться?
EUGY вне форума Ответить с цитированием
Старый 24.01.2013, 15:38   #3
Nomicos
Пользователь
 
Регистрация: 16.12.2010
Сообщений: 18
По умолчанию

EUGY, другие значения.

Например, если есть массив 1 2 3 4, то после сдвига вправо на один (k = 1)
массив должен будет принять вид: 4 1 2 3.
Nomicos вне форума Ответить с цитированием
Старый 24.01.2013, 15:57   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Именно это проделывают STL функции rotate, rotate_copy, из <algorithm>.
Их исходный код примитивен, посмотри
http://www.cplusplus.com/reference/algorithm/rotate/
EUGY вне форума Ответить с цитированием
Старый 24.01.2013, 16:16   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Это называется циклический сдвиг элементов массива.
Вадим Мошев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сдвиг элементов массива и вопрос о strcpy neonakaneya Общие вопросы C/C++ 9 09.01.2012 00:27
циклический сдвиг элементов массива Carter Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2011 19:54
Сдвиг элементов массива на 1 влево. Вывести матрицу в Memo Abrokadawr Помощь студентам 3 04.11.2011 23:13
Удаление элементов массива и сдвиг Alex11223 Паскаль, Turbo Pascal, PascalABC.NET 1 12.01.2011 20:01
Описать процедуру,осуществляющую циклический сдвиг элементов массива на k позиций Bloodpoisoning Общие вопросы C/C++ 0 29.11.2010 15:50