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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 31.01.2009, 16:37   #1
12345678
Пользователь
 
Регистрация: 24.08.2008
Сообщений: 10
По умолчанию Задача про сдвиг массива

Есть такое задание дан одномерный массив, нужно задать число элементов и его сдвиг направо или налево. Сдвиг может быть больше, чем кол-во элементов, тоесть элементы могут несколько раз менятся местами. Надо написать условие обмена элементов местами, минимальным числом операторов, методом целочисленного деления, дополнительный массив создавать нельзя. Никак не могу понять как это сделать...

Пример дан массив из 5 эл. 1 2 3 4 5, сдвигаем массив влево на 2 элемента, получаем 3 4 5 1 2.

Код:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int m=0,x=0,n=0;
scanf_s("%i",&m);
scanf_s("%i",&n);
int*mass=new int[m];
for (int i=0;i<m;i++)
mass[i]=rand()%4;
for(int i=0;i<m;i++)
printf(" %i",mass[i]);

Здесь нужно придумать условие, по которому это всё будет происходить. 

printf(" ");
for(int i=0;i<m;i++)
printf(" %i",mass[i]);
return 0;
}
Модератор: тег CODE

Последний раз редактировалось MaTBeu; 02.02.2009 в 19:59.
12345678 вне форума
Старый 31.01.2009, 17:30   #2
breate
Пользователь
 
Аватар для breate
 
Регистрация: 30.12.2008
Сообщений: 78
По умолчанию задача

компилируется нетбинс
Код:
#include <iostream>
#include <stdlib.h>
using namespace std;
void sdvig(int *,int &,int );
int main(int argc, char** argv)
{
    cout<<"inputs number of element array";
    int number,*a;
    cin>>number;
    a=new int[number];
            for(int i=0;i<number;i++)
                cin>>a[i];
    int how;
    cin>>how;
    sdvig(a,number,how);
    for(int i=0; i<number;i++)
        cout<<a[i];


    return (EXIT_SUCCESS);
}
void sdvig(int *a,int &number,int how)
{
    if (how==0)return;
    do
    {
    int tmp=a[number-1];
    for(int i=number-1;i>0;i--)
    {
    a[i]=a[i-1];
    }
    a[0]=tmp;
        how--;
    }while(how);
}
результат работы
Код:
inputs number of element array5
1 2 3 4 5
2
45123[Press Enter to close window]
если срочно
сегодня посижу подумую про целочисленное деление
Моя работа - Создание сайтов

Последний раз редактировалось breate; 31.01.2009 в 17:35.
breate вне форума
Старый 31.01.2009, 17:32   #3
12345678
Пользователь
 
Регистрация: 24.08.2008
Сообщений: 10
По умолчанию

Спасибо большое
12345678 вне форума
Старый 31.01.2009, 18:34   #4
12345678
Пользователь
 
Регистрация: 24.08.2008
Сообщений: 10
По умолчанию

Да если получится нужно целочисленное деление, и запись программы надо сделать проще, так как на момент задания, мы не проходили ещё функции.
12345678 вне форума
Старый 31.01.2009, 19:58   #5
12345678
Пользователь
 
Регистрация: 24.08.2008
Сообщений: 10
По умолчанию

Ни у кого идей нет? Как это сделать с помощью операции остатка от деления?

Последний раз редактировалось 12345678; 31.01.2009 в 20:04.
12345678 вне форума
Старый 01.02.2009, 01:56   #6
Pendulum
 
Регистрация: 15.01.2008
Сообщений: 4
По умолчанию

Есть идеи.

Если сдвиг больше, чем количество элементов, то нет необходимости пробегать их все в цикле, т. к. сдвиг на n элементов n-мерного массива даст нам в результате исходный массив. (Размерность массива представляет для сдвига что-то типа "периода".)

Если брать вариант кода breate, то его можно преписать так:
Код:
how %= number;
while(how)
    {
    int tmp=a[number-1];
    for(int i=number-1;i>0;i--)
    {
    a[i]=a[i-1];
    }
    a[0]=tmp;
        how--;
    };
Учтите, здесь реализован только сдвиг вправо!
Pendulum вне форума
Старый 01.02.2009, 12:37   #7
breate
Пользователь
 
Аватар для breate
 
Регистрация: 30.12.2008
Сообщений: 78
По умолчанию RE

Цитата:
Если сдвиг больше, чем количество элементов, то нет необходимости пробегать их все в цикле, т. к. сдвиг на n элементов n-мерного массива даст нам в результате исходный массив. (Размерность массива представляет для сдвига что-то типа "периода".)
Вы гений! у меня ума не хватило! блин я думал как нить за 10 зацепится

Цитата:
и запись программы надо сделать проще
я не люблю грамоздкие мэйн просто вытощи участок функции в мэйн в то место где она вызывается, только вместо ретурна поставь инструкцию break;

при здвиге влево можно использовать значение
how %= number; // это эквивалентно how=how%number;
if (how<0) how=number+how;
эта функция больше показательная чем логическая список аргументов(*,&,переменная)
Моя работа - Создание сайтов
breate вне форума
Старый 01.02.2009, 13:54   #8
12345678
Пользователь
 
Регистрация: 24.08.2008
Сообщений: 10
По умолчанию

Код:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
void sdvig();
int main()
{
    cout<<"inputs number of element array";
    int number,*a;
    cin>>number;
    a=new int[number];
            for(int i=0;i<number;i++)
                cin>>a[i];
    int how;
    cin>>how;
    {
   how%=number;
	 while(how)
	 {
	   int tmp=a[number-1];
		for(int i=number-1;i>0;i--)
		{a[i]=a[i-1];
		}
		a[0]=tmp;
		how--;
	 }
}
    for(int i=0; i<number;i++)
        cout<<a[i];
 }
В упрощённом виде так получается выглядит?
12345678 вне форума
Старый 01.02.2009, 14:15   #9
12345678
Пользователь
 
Регистрация: 24.08.2008
Сообщений: 10
По умолчанию

У меня вопросы возникли, точнее мне придётся на них явно отвечать, причём рассказывая не в общих словах.
Вот на что мне ответить придётся
1) int number,*a;-почему *а.
2) a=new int[number];-что делает в данном случае оператор new.

Последний раз редактировалось 12345678; 01.02.2009 в 19:47.
12345678 вне форума
Старый 01.02.2009, 19:48   #10
12345678
Пользователь
 
Регистрация: 24.08.2008
Сообщений: 10
По умолчанию

Я правильно понял, что new выделяет память под массив состоящий из number элементов. А почему перед а надо указывать*?
12345678 вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача про деревья. WhyBeNormal Паскаль, Turbo Pascal, PascalABC.NET 0 21.12.2008 23:51
Задачка про массив - Из массива удалить четные элементы, стоящие после максимального Crookers Общие вопросы C/C++ 4 23.09.2008 19:35
циклический сдвиг массива goacher Общие вопросы C/C++ 4 28.05.2008 20:11
циклический сдвиг массива goacher Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2008 22:26