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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
#1

Поменять местами две серии в массиве. - C++

30.10.2009, 17:19. Просмотров 2108. Ответов 15
Метки нет (Все метки)

Помогите пожалуйста со следующей задачей.
Задан целочисленный массив размера N. Поменять местами i-ую и j-ую
серии массива. Номера i и j вводятся пользователем.
Использовать дополнительные массивы запрещено.
Если бы не было последнего условия, задача была бы простой. Язык программирования С.
Заранее спасибо всем откликнувшимся.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2009, 17:19     Поменять местами две серии в массиве.
Посмотрите здесь:
C++ Поменять местами две серии в массиве
C++ Создать одномерный массив, заполнить его случайными числами. Поменять в массиве местами две его половины
В двумерном массиве поменять местами максимальный и минимальный элемент местами C++
Поменять местами две строки матрицы C++
Поменять местами две любые строки матрицы C++
Двумерный массив: поменять местами две строки C++
Двумерный массив: поменять местами две строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.10.2009, 17:24     Поменять местами две серии в массиве. #2
Цитата Сообщение от Horrorous Посмотреть сообщение
Поменять местами i-ую и j-ую
серии массива.
Что значит "серии" ?
Массив целочисленный(POD). Значит оператор [] дает доступ к элементу, значит поменять можно элементы.

Поясните.
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
30.10.2009, 17:28  [ТС]     Поменять местами две серии в массиве. #3
Серия – последовательность одинаковых элементов в массиве. Один элемент – это
тоже серия длиной равной единице.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.10.2009, 18:10     Поменять местами две серии в массиве. #4
Цитата Сообщение от Horrorous Посмотреть сообщение
Один элемент – это тоже серия длиной равной единице.
Попросил пояснить же...
Так что, поменять один элемент местами со вторым?
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
30.10.2009, 18:42  [ТС]     Поменять местами две серии в массиве. #5
поменять надо местами эти серии
Пример
массив: 1112334445556
i=2
j=5
результат:1115553344426
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.10.2009, 18:44     Поменять местами две серии в массиве. #6
О! Понял. Щас.
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
30.10.2009, 20:57  [ТС]     Поменять местами две серии в массиве. #7
Все еще нуждаюсь в помощи по данной задаче
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.10.2009, 21:05     Поменять местами две серии в массиве. #8
Horrorous, Упс Я забыл. В общем сделаю(пятницо же )
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
30.10.2009, 21:20  [ТС]     Поменять местами две серии в массиве. #9
мне прост завтра уже нужна эта задача, так что если можете то сдейте сегодня, а если нет то что ж поделаешь, спс хоть за то что откликнулись
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
30.10.2009, 22:09     Поменять местами две серии в массиве. #10
Вот, сделано неоптимально и на скорую руку, но для лабораторной сойдёт (:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
#include <locale>
#include <iostream>
 
template <typename T>
struct finder : public std::unary_function<T, bool>
{
    typedef typename std::iterator_traits<typename T::value_type::first_type>::value_type value_type;
 
    finder(value_type v) : v_(v) {}
    
    bool operator()(const typename T::value_type& v) const
    {
        return *v.first == v_;
    }
 
    const value_type v_;
};
 
template <typename T>
void mutate_sequance(T begin, T end)
{
    typedef typename std::iterator_traits<T>::value_type value_type;    
    
    typedef std::vector<std::pair<T, T> > V;
    V v;
    
    T curr = begin, next;
    for(; (next = std::adjacent_find(curr, end, std::not2(std::equal_to<value_type>()))) != end; curr = ++next)
        v.push_back(std::make_pair(curr, next+1));
 
    v.push_back(std::make_pair(curr, next));
 
    typename V::iterator _1 = std::find_if(v.begin(), v.end(), finder<V>(2));
    typename V::iterator _2 = std::find_if(v.begin(), v.end(), finder<V>(5));
    std::iter_swap(_1, _2);
 
    std::cout << "После:\t";
    for (typename V::const_iterator it = v.begin(); it != v.end(); ++it)
        std::copy(it->first, it->second, std::ostream_iterator<value_type>(std::cout, " "));
    std::cout << std::endl;
}
 
int main()
{
    setlocale(LC_ALL, "");
    int arr[] = {1,1,1,2,3,3,4,4,4,5,5,5,6};
    const size_t N = sizeof(arr) / sizeof(arr[0]);
 
    std::vector<std::pair<const int*, const int*> > v;
 
    std::cout << "До:\t";
    std::copy(arr, arr+N, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    mutate_sequance(arr, arr+N);
 
    return 0;
}
Вывод:
До: 1 1 1 2 3 3 4 4 4 5 5 5 6
После: 1 1 1 5 5 5 3 3 4 4 4 2 6
Проверка: http://codepad.org/p6Nf23rx
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
30.10.2009, 22:14  [ТС]     Поменять местами две серии в массиве. #11
Дело в том что нужно написать программу на С а не на с++, если это возможно не могли бы вы перевести это на C
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
30.10.2009, 22:15     Поменять местами две серии в массиве. #12
На Си гемора будет много. лень (:
SONNY
8 / 8 / 0
Регистрация: 30.05.2009
Сообщений: 47
30.10.2009, 22:18     Поменять местами две серии в массиве. #13
так еще можно попробовать

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <algorithm>
#include <functional>
 
template<typename _RndIt, typename _Tr = std::iterator_traits<_RndIt> > class Swap_seq
{
public:
    typedef typename _Tr::value_type value_type;
    typedef std::reverse_iterator<_RndIt> Rev_iter;
 
    static void swap_seq( _RndIt first, _RndIt last, value_type v_1, value_type v_2 )
    {
        _RndIt begin_1 = std::find( first, last, v_1 );
        _RndIt end_1 = std::find( Rev_iter(last), Rev_iter(first), v_1 ).base();
        typename _Tr::difference_type count_1 = std::count( first, last, v_1 );
 
        _RndIt begin_2 = std::find( first, last, v_2 );
        _RndIt end_2 = std::find( Rev_iter(last), Rev_iter(first), v_2 ).base();
       typename _Tr::difference_type count_2 = std::count( first, last, v_2 );
 
      if( count_1 > count_2 )
      {
          while( count_1-- != 0 )
              std::swap( *(begin_1++), *(--end_2) );
      }
      else
      {
          while( count_2-- != 0 )
              std::swap( *(begin_1++), *(--end_2) );
      }
 
    }
};
 
int _tmain( int argc, _TCHAR* argv[] )
{
    int coll[] = { 1, 1, 1, 2, 3, 3, 8, 8, 9, 9, 9 };
       const size_t size = sizeof(coll)/sizeof(int);
 
    Swap_seq<int*>::swap_seq( coll, coll + size, 2, 9 );
 
}
ISergey
Maniac
Эксперт С++
1372 / 883 / 52
Регистрация: 02.01.2009
Сообщений: 2,652
Записей в блоге: 1
30.10.2009, 22:19     Поменять местами две серии в массиве. #14
Цитата Сообщение от Rififi Посмотреть сообщение
Вот, сделано неоптимально и на скорую руку, но для лабораторной сойдёт (:
За такую лабораторную ему экзамен автоматом поставят..
Horrorous
0 / 0 / 0
Регистрация: 13.04.2009
Сообщений: 38
30.10.2009, 22:23  [ТС]     Поменять местами две серии в массиве. #15
ISergey, эт точно Еще если считать что мы ток массивы на С прошли

Добавлено через 1 минуту
SONNY, боюсь что это тоже на С++ и тоже не подходит, сделайте плиз тоже на С потому что сам я абсолютно ничего не понимаю в том что написано на С++...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2009, 00:14     Поменять местами две серии в массиве.
Еще ссылки по теме:
C++ Поменять местами две заданные строки матрицы
C++ В матрице поменять местами две строки с заданными номерами
Поменять местами две средние строки матрицы с первой и последней C++
C++ Разработать функцию, позволяющую поменять местами две произвольные строки матрицы
Поменять местами две половины очереди без использования дополнительной памяти C++

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

Или воспользуйтесь поиском по форуму:
ISergey
Maniac
Эксперт С++
1372 / 883 / 52
Регистрация: 02.01.2009
Сообщений: 2,652
Записей в блоге: 1
31.10.2009, 00:14     Поменять местами две серии в массиве. #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вроде так..
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdlib.h>
 
int find_f(int x, int *arr, int size){
    int i;
    for( i = 0; i < size; ++i)
        if(arr[i] == x)
            return i;
    return -1;
}
int find_l(int x, int *arr, int size){
    int i;
    for( i = size - 1; i >= 0; --i)
        if(arr[i] == x)
            return i;
    return -1;
}
 
int count_(int p, int *arr){
    int count = 0;
    int *_p = arr + p;
    while(*_p == *(arr + p)){
        ++count;
        ++_p;
    }
    return count;
}
 
void shift_right(int e, int pos, int *arr, int size){
    int buff, i;
    int pos_e = find_f(e, arr, size);
    int count_e = count_(pos_e, arr);
    pos += (count_(pos, arr) - 1); 
    for( i = 0; i < count_e; ++i){
        while(arr[pos - i] != e){
            buff = arr[pos_e];
            arr[pos_e] = arr[pos_e + 1];
            arr[pos_e + 1] = buff;
            ++pos_e;
        }
        pos_e = find_f(e, arr, size);
    }
}
void shift_left(int e, int pos, int *arr, int size){
    int buff, i;
    int pos_e = find_f(e, arr, size);
    int count_e = count_(pos_e, arr);
    for( i = 0; i < count_e; ++i){
        pos_e = find_l(e, arr, size);
        while(arr[pos + i] != e){
            buff = arr[pos_e];
            arr[pos_e] = arr[pos_e - 1];
            arr[pos_e - 1] = buff;
            --pos_e;
        }
    }
}
int main(){
 
    int arr[] = {1, 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6};
    int size = sizeof(arr)/sizeof(arr[0]);
    int _i = 2, _j = 5, i;
    int pos_j = find_f(_j, arr, size),
        pos_i = find_f(_i, arr, size);
    
    shift_left (_j, pos_i, arr, size);
    shift_right(_i, pos_j, arr, size);
 
    for( i = 0; i < size; ++i){
        printf("%d ", arr[i]);
    }
 
    printf("\n");
    return 0;
}
Результат
i = 2, j = 5;
1 1 1 5 5 5 3 3 4 4 4 2 6 6
i = 4, i = 6;
1 1 1 2 3 3 6 6 5 5 5 4 4 4
i = 1, j = 5
5 5 5 2 3 3 4 4 4 1 1 1 6 6
Yandex
Объявления
31.10.2009, 00:14     Поменять местами две серии в массиве.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru