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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2019, 22:49   #1
aaleshka
Новичок
Джуниор
 
Регистрация: 20.03.2019
Сообщений: 1
По умолчанию Массивы

Добрый день всем жителям форума. Нужна помощь в задаче, сразу извиняюсь за возможно не правильное оформление её, ещё не знаю как тут это делать.

Вообщем, условие такое:
Напишите программу, которая выполняет циклический сдвиг части массива, начиная с
элемента с номером K и заканчивая элементом с номером M (включительно), влево
на R элементов. Нумерация элементов массива начинается с единицы.

Код:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
	int const N=10;
	int A[N];
	int a=0;
	int b=100;
	int c,x,y,z;
	
		setlocale(LC_ALL, "Russian");
		cout<<"Введите число с которого начинается реверс, от 1 до 10:  ";
		cin>>x;
		if((x>=N)||(x<0))
		system ("pause");
		cout<<endl;
		cout<<"Введите число которым закончится реверс:  ";
		cin>>y;
		if ((y>N)&&(y>x))
		system ("pause");
		cout<<"Введите число на которое реверс должен сдвинуться влево:  ";
		cin>>z;
		if (z>N)
		system ("pause");
	
		
	for(int i=0;i<N;i++){
        A[i]=rand()%(b-a+1);
        cout <<A[i]<< " ";
    }
    cout<<endl;
    
    for (int p=0; p<x; p++ )
    cout<<A[p]<<" ";
    for(int q=x;q<N;q++){
    	c=A[q];
    	A[q]=A[y-z];
    	A[y-z]=c;
    	if(q<y+z)
    	cout<<A[q]<<" ";
    	else 
		cout<<A[y-z]<<" ";
	}
    
}
Это мой код, скажите, что в нём не так, почему не всегда получается правильно?! (Например, при 2,10,1 -- всё правильно, а вот уже 2,10,2, идёт не правильно)
aaleshka вне форума Ответить с цитированием
Старый 20.03.2019, 23:45   #2
Байтик
Пользователь
 
Регистрация: 21.12.2018
Сообщений: 28
По умолчанию

Первая ваша ошибка - вы путаете номера и индексы. Номера начинаются с 1 и кончаются 10-м. Индексы начинаются с 0 и кончаются девяткой. Вводите вы номера, а работаете в программе с индексами. Значит, первое, что вам надо сделать после ввода:
Код:
x--; y--; z--;
Теперь вопрос. Вам достаточно вывести массив на печать? Или нужно его преобразовать в памяти? В первом случае задача чрезвычайно проста.
Код:
for (int p=0; p<x; p++ )
    cout<<A[p]<<" ";
for(p=x; p<y; p++)
    cout<< A[(p%(y-z) + x] << " ";
for (int p=y; p<N; p++ )
    cout<<A[p]<<" ";
Во втором случае задача не совсем тривиальна. Можно, конечно, z раз произвести циклический сдвиг на 1, но это не красиво и не эффективно.
Есть алгоритм под кодовым названием "Два кулака". Для массива (без хвостов) он выглядит так. делим массив на 2 части (z - на сколько сдвигаем) каждую часть переворачиваем (реверсируем). Потом переворачиваем весь массив. Готово! Посмотрите на бумажке, и вы увидите, как это работает
Байтик вне форума Ответить с цитированием
Старый 20.03.2019, 23:47   #3
Байтик
Пользователь
 
Регистрация: 21.12.2018
Сообщений: 28
По умолчанию

Вот пример (z=2, N=5)
1 2 3 4 5
2 1 5 4 3
3 4 5 1 2
Байтик вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать программу массивы (C++) - Даны два массива, скопировать эти массивы в 3-й результирующий (размером 10 элементов) так, что Саша1990 Помощь студентам 1 02.02.2015 16:03
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
Двумерные массивы(матрица) 2)Строковые массивы(строки): 3)Структуры nuriyat Помощь студентам 1 21.01.2012 16:16
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12