Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
7
Добавлен:
01.05.2014
Размер:
10.82 Кб
Скачать
Const nMax=100;
type indexV=1..nMax;
indexV1=1..nMax+1;
indexV0=0..nMax;
Elem=Char;
vector=array [indexV] of Elem;
{ ’аЁ а §«Ёз­ле аҐиҐ­Ёп § ¤ зЁ ЇҐаҐбв ­®ўЄЁ ᬥ¦­ле ᥣ¬Ґ­в®ў }
{ ¬ ббЁў  (Ё«Ё § ¤ зЁ жЁЄ«ЁзҐбЄ®Ј® б¤ўЁЈ  ᥣ¬Ґ­в  ¬ ббЁў ) }
{ }
{1-© ў аЁ ­в -----------------------------------------------------}
{ ‚бЇ®¬®Ј вҐ«м­ п дг­ЄжЁп: ЌЋ„ ( GCD ) }
function GCD(a, b: Word): Word;
var u,v,Remainder : Word;
begin
u := a; v := b;
{ u>=0 & v>=0 & GCD(u,v)=GCD(a,b) }
while v <> 0 do
begin { u>=0 & v>0 & GCD(u,v)=GCD(a,b) }
Remainder := u mod v;
u := v; v := Remainder;
{ u>0 & v>=0 & GCD(u,v)=GCD(a,b) }
end {while};
{ u>=0 & v=0 & u=GCD(u,0)=GCD(a,b) }
GCD:=u
end{GCD};

procedure Shift1(var a: vector; n, m: indexV);
{ –ЁЄ«ЁзҐбЄЁ© б¤ўЁЈ ᥣ¬Ґ­в  ¬ ббЁў : }
{ n - а §¬Ґа ¬ ббЁў  - a[1..n]; }
{ m - а §¬Ґа б¤ўЁЈ Ґ¬®Ј® ᥣ¬Ґ­в  - a[1..m]; }
{ (n-m) - ўҐ«ЁзЁ­  б¤ўЁЈ  ўЇа ў®; }
{ Ё«Ё (¤агЈ п Ё­вҐаЇаҐв жЁп) ўҐ«ЁзЁ­  б¤ўЁЈ  ў«Ґў® = m }
{ ЏаҐ¤гб«®ўЁҐ: 1<=m<n }
{ Ќ з «м­®Ґ б®бв®п­ЁҐ: }
{ 1 m n }
{ ЙННННННННННННННШННННННННННННННННННННННННННННН» }
{ a: є A[1..m] і A[m+1..n] є }
{ ИННННННННННННННШНННННННННННННННННННННННННННННј }
{ і /А Д Д Д Д Д Д Д Д Д Д Д Д Д Д/ї }
{ / / }
{ і /<ДДДДДДДДДДДДДДДДДДДДДДДДДДД>/ і }
{ / / }
{ А Д Д /Д Д Д Д Д Д Д Д Д Д Д Дї / і }
{ / Џ®бвгб«®ўЁҐ: / }
{ / n-mі / і }
{ ЙННННННННННННННПННННННННННННННШНННННННННННННН» }
{ a: є A[m+1..n] і A[1..m] є }
{ ИННННННННННННННСННННННННННННННШННННННННННННННј }
{ 1 m n-m+1 n }
{--------------------------------------------------------}
var Nc, q, {p, i,} Cur, Next: IndexV;
aTemp: Elem;
begin {Shift1}
if (1<=m) and (m<n) then
begin
{Nc - зЁб«® жЁЄ«®ў (§ ¬Є­гвле ва ҐЄв®аЁ©) ЇҐаҐбв ­®ў®Є}
Nc:=GCD(n,m); {p:=n div Nc;}
for q:=1 to Nc do
begin {®Ўа Ў®вЄ  q-Ј® жЁЄ«  ЇҐаҐбв ­®ў®Є
(q-®© § ¬Є­гв®© ва ҐЄв®аЁЁ) }
aTemp:=a[q];
Cur:=q;
Next:=Cur+m; if Next>n then Next:=Next-n;
{Cur - Єг¤  ЇҐаҐ¬Ґй вм,   Next - ®вЄг¤ }
while Next<>q do {for i:=1 to p-1 do}
begin
a[Cur]:=a[Next];
Cur:=Next;
Next:=Next+m; if Next>n then Next:=Next-n
end{while};
{Next=q}
a[Cur]:=aTemp
end{for q}
end{then} else WriteLn('ЌҐЄ®а४в­л© ўл§®ў Їа®жҐ¤гал Shift1')
{end-if}
end{Shift1};

{2-© ў аЁ ­в ----------------------------------------------------}
{ ђҐиҐ­ЁҐ ­  ®б­®ўҐ ўбЇ®¬®Ј вҐ«м­®© Їа®жҐ¤гал SwapEq ЇҐаҐбв ­®ўЄЁ}
{ ᥣ¬Ґ­в®ў а ў­®© ¤«Ё­л }

procedure SwapEq (var a: Vector; m, k: indexV; s: indexV0);
{ Pred: (Low(a)<=m) & (m+s<=k) & (k+s<=High(a)+1) & }
{ & (a[m..k+s)=A[m..k+s)) }
{ Post: (m+s<=k) & (a[m..m+s)=A[k..k+s)) & }
{ & (a[k..k+s)=A[m..m+s)) & (a[m+s..k)=A[m+s..k)) }
{............................................................}
{€«Ё m m+s k k+s n}
{Pred: ЙННННННННННННННШНННННННОННННННННННННННШНННННН» }
{ a: є A[m..m+s) і є A[k..k+s) і є }
{ ИННННННННННННННШНННННННОННННННННННННННШННННННј }
{ }
{ АДДДДДДВДДДДДДДЩ АДДДДДДДВДДДДДДЩ }
{ s s }
{Post: — бвЁ A[m..m+s) Ё A[k..k+s) ЇҐаҐбв ў«Ґ­л }
{............................................................}
var i: indexV;
j: indexV0;
b: Elem;
begin {SwapEq}
j:=k-1;
for i:=m to m+s-1 do
begin { a[i] <-> a[k+i-m] }
j:=j+1; {j:=k+i-m;}
b:=a[i]; a[i]:=a[j]; a[j]:=b
end
end{SwapEq};

procedure Shift2 (var a: vector; m, n, k: indexV1);
{ }
{ –ЁЄ«ЁзҐбЄЁ© б¤ўЁЈ ᥣ¬Ґ­в  ¬ ббЁў  Ё«Ё }
{ ЇҐаҐбв ­®ўЄ  ᬥ¦­ле ᥣ¬Ґ­в®ў а §­®© ¤«Ё­л: }
{ }
{ ЏаҐ¤гб«®ўЁҐ: m<k<n }
{ Ќ з «м­®Ґ б®бв®п­ЁҐ: }
{ n-k }
{ k-m ЪДДДДДДДДДДДДДДДБДДДДДДДДДДДДДї }
{ ЪДДДДДДДБДДДДДДї }
{ m k n }
{ ЙННННННННННННННШННННННННННННННННННННННННННННН» }
{ a: є A[m..k) і A[k..n) є }
{ ИННННННННННННННШНННННННННННННННННННННННННННННј }
{ і /А Д Д Д Д Д Д Д Д Д Д Д Д Д Д/ї }
{ / / }
{ і /<ДДДДДДДДДДД(n-k)ДДДДДДДДДДД>/ і }
{ / / }
{ А Д Д /Д Д Д Д Д Д Д Д Д Д Д Дї / і }
{ / Џ®бвгб«®ўЁҐ: / }
{ / і / і }
{ ЙННННННННННННННПННННННННННННННШНННННННННННННН» }
{ a: є A[k..n) і A[m..k) є }
{ ИННННННННННННННСННННННННННННННШННННННННННННННј }
{ m k s=m+n-k n }
{........................................................}
var p, q: IndexV;
begin {Shift2}
{Pred: (m<k<n) & (a[m..n)=A[m..n)),
Post: (s=m+n-k) & (a[m..s)=A[k..n)) & (a[s..n)=A[m..k)) }

p:=k-m;
q:=n-k;

{bound: max(p,q)}
{inv: б¬.Є авЁ­Єг}
{ m k-p k k+q n }
{ ЪДДДДДДДДДВДДДДДДДДДДДЕДДДДДДДДДДДДДДДВДДДДДДДДДДДДї }
{ a:і“¦Ґ гбв -іЏҐаҐбв ўЁвмі ЏҐаҐбв ўЁвм і “¦Ґ гбв - і & }
{ і­®ў«Ґ­ іб a[k..k+q)і б a[k-p..k) і ­®ў«Ґ­ і }
{ АДДДДДДДДДБДДДДДДДДДДДЕДДДДДДДДДДДДДДДБДДДДДДДДДДДДЩ }
{ & (0<p<=k-m) & (0<q<=n-k) }

while p<>q do
if p>q then begin SwapEq(a, k-p, k, q);
p:=p-q
end
else {p<q}
begin SwapEq(a, k-p, k+q-p, p);
q:=q-p
end;
{end-while}
SwapEq(a, k-p, k, p)

end {Shift2};

{3-© ў аЁ ­в -----------------------------------------------------}
{ ђҐиҐ­ЁҐ ­  ®б­®ўҐ ўбЇ®¬®Ј вҐ«м­®© Їа®жҐ¤гал Reverse ®Ўа йҐ­Ёп }
{ ᥣ¬Ґ­в  ¬ ббЁў  }

procedure Reverse(var a: Vector; m, n: IndexV1);
{Pred: (Low(a)<=m) & (m<n<=High(a)+1) & a[m..n)= A[m..n) }
{Post: (Low(a)<=m) & (m<n<=High(a)+1) & a[m..n)=Rev(A[m..n))}
{ Ј¤Ґ Rev(A[m..n)) = (A[n-1],A[n-2],A[n-3],...,A[m+1],A[m]) }

var k, i: indexV;
j: IndexV1;
mn1: Integer;
b: Elem;
begin {Reverse}
{P([m..i])==(a[m..i]=Rev(A[j..n)) & (a[j..n)=Rev(A[m..i]) &
& (a(i..j)=A(i..j)) & (m<=i<k) & (i+j=m+n-1) & (k=(m+n) div 2)}

k:=(m+n) div 2; mn1:=m+n-1; j:=n;
for i:=m to k-1 do
begin { a[i] <-> a[mn1-i] }
j:=j-1 {j:=mn1-i};
b:=a[i]; a[i]:=a[j]; a[j]:=b
end {for}
end {Reverse};

procedure Shift3 (var a: vector; m, n, k: indexV1);
{ }
{ –ЁЄ«ЁзҐбЄЁ© б¤ўЁЈ ᥣ¬Ґ­в  ¬ ббЁў  Ё«Ё }
{ ЇҐаҐбв ­®ўЄ  ᬥ¦­ле ᥣ¬Ґ­в®ў а §­®© ¤«Ё­л: }
{ }
{ ЏаҐ¤гб«®ўЁҐ: m<k<n }
{ Ќ з «м­®Ґ б®бв®п­ЁҐ: }
{ n-k }
{ k-m ЪДДДДДДДДДДДДДДДБДДДДДДДДДДДДДї }
{ ЪДДДДДДДБДДДДДДї }
{ m k n }
{ ЙННННННННННННННШННННННННННННННННННННННННННННН» }
{ a: є A[m..k) і A[k..n) є }
{ ИННННННННННННННШНННННННННННННННННННННННННННННј }
{ і /А Д Д Д Д Д Д Д Д Д Д Д Д Д Д/ї }
{ / / }
{ і /<ДДДДДДДДДДД(n-k)ДДДДДДДДДДД>/ і }
{ / / }
{ А Д Д /Д Д Д Д Д Д Д Д Д Д Д Дї / і }
{ / Џ®бвгб«®ўЁҐ: / }
{ / і / і }
{ ЙННННННННННННННПННННННННННННННШНННННННННННННН» }
{ a: є A[k..n) і A[m..k) є }
{ ИННННННННННННННСННННННННННННННШННННННННННННННј }
{ m k s=m+n-k n }
{........................................................}
begin {Shift3}
Reverse( a, m, k);
Reverse( a, k, n);
Reverse( a, m, n)
end {Shift3};

procedure Generation (var a: Vector; n: IndexV);
var b, i: IndexV;
begin
{ЈҐ­Ґа жЁп ¬ ббЁў  бЁ¬ў®«®ў}
i:=Ord('a')-1;
for b:=1 to n do
begin a[b]:=Char(i+b); Write(a[b]) end;
WriteLn;
end{Generation};

procedure OutVec (const a: Vector; n: IndexV);
var b: IndexV;
begin
for b:=1 to n do Write(a[b]);
WriteLn;
{WriteLn('--------------------------------------------');}
end{OutVec};

var a: vector;
n, m:IndexV;


begin {main}
n:=50;
m:=15;

{1-© ¬Ґв®¤:}
WriteLn('-----------------1-© ¬Ґв®¤:-----------------');
Generation(a,n);
Shift1(a, n, m);
OutVec(a,n);

{2-© ¬Ґв®¤:}
WriteLn('-----------------2-© ¬Ґв®¤:-----------------');
Generation(a,n);
Shift2(a, 1, n+1, m+1);
OutVec(a,n);

{3-© ¬Ґв®¤:}
WriteLn('-----------------3-© ¬Ґв®¤:-----------------');
Generation(a,n);
Shift3(a, 1, n+1, m+1);
OutVec(a,n);
WriteLn('-------------Љ®­Ґж-¤Ґ¬®­бва жЁЁ-----------');
end.