Форум программистов, компьютерный форум CyberForum.ru

Переставить первые М-элементов в конец массива - C++

Восстановить пароль Регистрация
 
Iren1
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 91
22.01.2014, 00:12     Переставить первые М-элементов в конец массива #1
Всем доброго времени суток) Помогите кто может переделать задачу.
Условие:Переставить первые М-элементов в конец массива (М вводится с клавиатуры, М<N).
есть эта задача на паскале у меня.. а мне нужно в с++. или визуал студио..
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program z1;
 
uses
  crt;
 
var
  mas: array[1..100] of integer;
  i, c, n: integer;
  a, b: integer;
 
begin
  clrscr;
  write('Введите размер массива = ');readln(n);
  Write('Zap = ');
  for i := 1 to n do
    read(mas[i]);
  write('Введите кол-во символов ');readln(c); 
  for i := c + 1 to n do
    write(mas[i], ' ');
  for i := 1 to c do
    write(mas[i], ' ');
  writeln;  
end.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2014, 00:12     Переставить первые М-элементов в конец массива
Посмотрите здесь:

C++ Не используя дополнительных массивов переставить начало и конец массива
Перенести первые к элементов в конец C++
Получить первые n-минимальных элементов массива,используя указатели C++
C++ Вывести на экран первые 10 четных элементов массива
Не использую доп. элементов массива переставить элементы массива в обратном порядке C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vans37
 Аватар для vans37
35 / 19 / 1
Регистрация: 28.01.2013
Сообщений: 37
22.01.2014, 03:56     Переставить первые М-элементов в конец массива #2
Цитата Сообщение от Iren1 Посмотреть сообщение
Всем доброго времени суток) Помогите кто может переделать задачу.
Условие:Переставить первые М-элементов в конец массива (М вводится с клавиатуры, М<N).
есть эта задача на паскале у меня.. а мне нужно в с++. или визуал студио..
Вот так фокус с выводом,конечно,это не мешает решению задачи,но,может всё-таки,необходимо перестановки в массиве делать,а не играться с выводом?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
 
int main()
{
    int arr[99],i,c,n,a,b;
    do{
      cout<<"Введите размер массива ="<<endl;
      cin>>n;
 
    }while(n<=0||n>=100);
    for(i = 0; i<n;i++)
       cin>>arr[i];
    for(i = 0; i<n;i++)
       cout<<arr[i]<<"\t";
 
    cout<<"Введите кол-во символов="<<endl;
    cin>>c;
    for(i=c;i<n;i++)
        cout<<arr[i]<<" ";
    for(i=0;i<c;i++)
        cout<<arr[i]<<" ";
 
 
 
}
Iren1
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 91
22.01.2014, 11:41  [ТС]     Переставить первые М-элементов в конец массива #3
чет не работает(
я эту задачу на паскале нашла тут Переставить первые М-элементов в конец массива

посмотрите плиз
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.01.2014, 11:55     Переставить первые М-элементов в конец массива #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iterator>
#include <vector>
#include <algorithm>
 
template <typename T>
std::ostream& operator << (std::ostream& os, const std::vector<T>& v)
{
   std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, " "));
   os << "\n";
   return os;
}
 
int main()
{
   std::vector<int> v {1,2,3,4,5,6,7,8,9};
   const int M = 3;
   std::rotate(v.begin(), v.begin() + M, v.end());
   std::cout << v;
 
   return 0;
}
Iren1
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 91
22.01.2014, 11:58  [ТС]     Переставить первые М-элементов в конец массива #5
мне надом вводить с клавиатуры((

Добавлено через 18 секунд
а не, чтобы они были заданы((
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.01.2014, 12:10     Переставить первые М-элементов в конец массива #6
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
   std::cout << "Enter numbers (any letters to stop):\n";
   std::vector<int> v {std::istream_iterator<int>(std::cin), std::istream_iterator<int>()};
 
   const int M = 3;
   std::rotate(v.begin(), v.begin() + M, v.end());
   std::cout << v;
 
   return 0;
}
Enter numbers (any letters to stop):
1 2 3 4 5 6 7 8 9 ^Z
4 5 6 7 8 9 1 2 3
Iren1
0 / 0 / 0
Регистрация: 20.01.2014
Сообщений: 91
22.01.2014, 12:48  [ТС]     Переставить первые М-элементов в конец массива #7
вы М задаете, как сталое.Оно у вас равно 3.А мне нужно чтобы оно вводилось пользователем
Hellkaa
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 2
05.11.2014, 19:53     Переставить первые М-элементов в конец массива #8
нужно эту задачу просто в Си, поможете?
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2908 / 1444 / 397
Регистрация: 18.10.2014
Сообщений: 2,662
05.11.2014, 20:04     Переставить первые М-элементов в конец массива #9
Сначала надо определиться, в чем же заключается задача.

Если условие задачи сформулировано именно так, то это скорее всего классическая задача программирования, подробно описанная еще у Бентли в "Жемчужина программирования". Перестановку надо выполнить физически в рамках исходного массива, не используя дополнительных массивов. Задача интересная и не тривиальная.

Если же разрешается использовать дополнительные массивы, то задача становится тривиальной.

Но то, что написано в исходной программе на Паскале, разумеется, не пойдёт. В задаче ясно сказано - переставить, а не просто "вывести на экран в переставленном виде".
Cookie Monster
16 / 16 / 3
Регистрация: 03.11.2014
Сообщений: 71
05.11.2014, 22:34     Переставить первые М-элементов в конец массива #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
const int N = 10;
int M = 0;
int ar[N];
//инициализация массива и числа M
//...
int temp;
for(int i = N - M, j = 0; i < N; i++, j++)
{
    ar[i] = temp;
    ar[i] = ar[j];
    ar[j] = temp;
}
такой норм вариант?
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2908 / 1444 / 397
Регистрация: 18.10.2014
Сообщений: 2,662
05.11.2014, 23:03     Переставить первые М-элементов в конец массива #11
Цитата Сообщение от Cookie Monster Посмотреть сообщение
такой норм вариант?
Во-первых, опять же, неизвестно что имеется в виду в условии. Скорее всего не это.

Во-вторых, подумайте, что произойдет в вашем коде, если M > N/2. Если уж реализовывать именно это, то элементы надо обменивать в порядке от больших индексов к меньшим.
Cookie Monster
16 / 16 / 3
Регистрация: 03.11.2014
Сообщений: 71
06.11.2014, 06:04     Переставить первые М-элементов в конец массива #12
Я понял.надо всего лишь зациклить массив.т. е. сделать так чтоб при смещении всех элементов вправо элементы из конца переходили в начало и делать это N -M раз
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2014, 07:17     Переставить первые М-элементов в конец массива
Еще ссылки по теме:

с++ , удалить первые 5 элементов из контейнера, звтем добавить в конец 3 новых элемента, доработка C++
Переставить значение элементов заданного одномерного массива, так чтобы все нулевые оказались в конце массива C++
C++ Перенести первые k строк в конец массива, соблюдая порядок их следования

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2908 / 1444 / 397
Регистрация: 18.10.2014
Сообщений: 2,662
06.11.2014, 07:17     Переставить первые М-элементов в конец массива #13
Цитата Сообщение от Cookie Monster Посмотреть сообщение
сделать так чтоб при смещении всех элементов вправо элементы из конца переходили в начало и делать это N -M раз
Да, это именно то, что я имел в виду под задачей из "Жемчужин программирования". Циклический сдвиг массива. Он же - обмен местами частей разной длины. Но решать эту задачу через многократно повторенный циклический сдвиг на 1 элемент - очень неэффективно.

В стандартной библиотеке С++ эта задача уже решена алгоритмом 'std::rotate' (уже использовался в ответе DiffEreD). "Возможную реализацию" можно посмотреть здесь: http://en.cppreference.com/w/cpp/algorithm/rotate

C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class ForwardIt>
void rotate(ForwardIt first, ForwardIt n_first, ForwardIt last)
{
    ForwardIt next = n_first;
    while (first != next) {
        std::iter_swap(first++, next++);
        if (next == last)
            next = n_first;
        else if (first == n_first)
            n_first = next;
    }
}
Вызов

C++
1
std::rotate(a, a + M, a + N);
перенесет начальный блок из M элементов в конец массива через циклический сдвиг.

Другая остроумная реализация этой операции - это перевернуть подмассив [0, M), перевернуть подмассив [M, N) и затем перевернуть весь массив, что можно сделать через алгоритм 'std::reverse'

C++
1
2
3
std::reverse(a, a + M);
std::reverse(a + M, a + N);
std::reverse(a, a + N);
Результат будет тот же.

Ну и у Бентли еще описано два дополнительных способа реализации того же.
Yandex
Объявления
06.11.2014, 07:17     Переставить первые М-элементов в конец массива
Ответ Создать тему
Опции темы

Текущее время: 17:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru