@TanT
эволюционирую потихоньку
467 / 465 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
|
16.01.2010, 13:36
|
|
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
| // Циклический сдвиг одномерного массива или строки
// итак, нужно преобразовать массив ab в bа.
// Предположим, что у нас есть функция reverse,
// переставляющая элементы некоторой части массива в
// противоположном порядке. В исходном состоянии массив имеет
// вид ab. Вызвав эту функцию для первой части, получим аrb
// (прим. редактора:аr - это модифицированная часть a, к которой
// применили фукнцию перестановки reverse). Затем вызовем ее для
// второй части: получим аrbr. Затем вызовем функцию для всего
// массива, что даст (аrbr)r, а это в точности соответствует bа.
// Посмотрим, как будет такая функция действовать на массив abcdefgh,
// который нужно сдвинуть влево на три элемента:
// псевдокод: Сдвиг через функцию перестановки reverse ссылка
// reverse(0, i-1) /* cba|defgh */
// reverse(i, n-1) /* cba|hgfed */
// reverse(0, n-1) /* defgh|abc */
#include <iostream>
#include <time.h>
#define randomize() srand(time(NULL))
#define SIZE 10
using namespace std;
void Reverse(int *begin, int *end)
{
int temp;
while (end>begin)
{
temp = *begin;
*begin = *end;
*end = temp;
begin++; end--;
}
} // end Reverse
int main()
{
int A[SIZE];
int i;
for (i=SIZE; --i>=0;)
A[i]=i; //rand()%10;
cout<<"A"<<endl; /// вывод
for (i=0; i<SIZE; i++)
cout<<A[i]<<' ';
cout<<endl;
//////////////////////////////////////////////////////////////////////////
// сам циклический сдвиг на i элементов
cout<<"number shift: "; cin>>i;
Reverse(&A[0], &A[i-1]);
Reverse(&A[i], &A[SIZE-1]);
Reverse(&A[0], &A[SIZE-1]);
//////////////////////////////////////////////////////////////////////////
cout<<"revA"<<endl; /// вывод
for (i=0; i<SIZE; i++)
cout<<A[i]<<' ';
cout<<endl; system("PAUSE");
return 0;
} // end main |
|
1
|