Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРАКТИКУМ_3.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
266 Кб
Скачать
☆

23. Нахождение обратной перестановки и по ней циклической формы

/* Нахожденение обратной перестановки для массива символов

и формирование к ней циклической формы перестановки */

#include "stdafx.h"

#include <conio.h>

#include <iostream>

using namespace std;

int revers_shift(); // функция построения обратной перестановки

int cycle_shift(); // функция построения циклической формы перестановки

#define SIZE 7 // максимально возможный набор букв в перестановке

#define SIZE_2 20 // максимально возможный размер циклической записи

char MAS_1[SIZE]={'e','a','c','d','b','h','f'}; // массив переставляемых символов

char MAS_2[SIZE]={'f','e','c','h','a','d','b'}; // массив переставленных символов

char MAS_11[SIZE]={'e','a','c','d','b','h','f'};

/* MAS_11[] -массив переставляемых символов,задает порядок перстановки столбцов */

void main()

{

revers_shift();

cycle_shift();

_getch();

}

int revers_shift()

{

int i,j;

char ch;

// перестановка строк

for(i = 0; i < SIZE; i++)

{

ch=MAS_1[i];

MAS_1[i]=MAS_2[i];

MAS_2[i]=ch;

}

cout<<"\n Given MAS_1 :"<<endl;

for(i = 0; i < SIZE; i++) cout<<MAS_2[i]<<" ";

cout<<"\n Given MAS_2 :"<<endl;

for(i = 0; i < SIZE; i++) cout<<MAS_1[i]<<" ";

// перстанока столбцов в первоначальном порядке

for(j = 0; j < SIZE-1; j++) // j - индекс массива MAS_11[]

for(i=0;i<SIZE;i++) // индекс первой строки

{ if(MAS_11[j]==MAS_1[i]) // i-й столбец должен стать j- ым

{

ch=MAS_1[i];

MAS_1[i]=MAS_1[j];

MAS_1[j]=ch;

ch=MAS_2[i];

MAS_2[i]=MAS_2[j];

MAS_2[j]=ch;

}

}

cout<<"\n New MAS_1 with old oder :"<<endl;

for(i = 0; i < SIZE; i++) cout<<MAS_1[i]<<" ";

cout<<"\n New MAS_2 :"<<endl;

for(i = 0; i < SIZE; i++) cout<<MAS_2[i]<<" ";

return 0;

}

int cycle_shift()

{

int i=0,j=0,k=0,m=0; // m - счетчик букв в MAS_3[]

// k - счетчик символов в MAS_3[]

char MAS_3[SIZE_2],tt; // MAS_3[] - циклическая форма перестановки

l1: MAS_3[k]='(';

k++;

MAS_3[k]= MAS_1[i];

m++;

tt=MAS_1[i]; // начало блока tt - буква в начале цикла

if(MAS_1[i]==MAS_2[i]) // единичный цикл в начале

{

k++;

MAS_3[k]=')';

i++;

goto l1;

}

k++;

MAS_3[k]=MAS_2[i];

m++;

while(j<SIZE) // цикл по элементам первой строки

{

if(MAS_3[k]==MAS_1[j]) // нашли переход

{

if(MAS_2[j]==tt) // окончание блока

{

k++;

MAS_3[k]=')'; // закрываем блок и открываем новый

if(m==SIZE) break;

// формирование нового блока

k++;

MAS_3[k]='(';

j=i;

// переход на начало просмотра 1-й строки для следующего блока

i++;

if(i==(SIZE-1)) break; // окончание работы

int ii=i; // сохраняем переменную

/* ищем, был ли новый элемент начала блока в MAS_3[], если да,

то переходим к следующему по первой строке, если нет, запоминаем его */

while(ii<SIZE) // пробегаем первую строку

{

int flag=0;

//признак того, что элемента пока нет в MAS_3[]

for(int jj=1;jj<=k;jj++) // пробегаем MAS_3[]

if(MAS_1[ii]==MAS_3[jj])

{flag=1; break;}

//признак того, что элемент есть в MAS_3[]

if (flag==0) {tt=MAS_1[ii]; i=ii;break;}

// tt - символ начала нового блока

ii++;

}

k++;

MAS_3[k]= MAS_1[i];

m++;

if(MAS_1[i]!=MAS_2[i])

{

k++;

MAS_3[k]= MAS_2[i];

m++;

}

else

{

k++;

MAS_3[k]=')'; // единичный цикл

k++;

MAS_3[k]='('; // открытие нового блока

k++;

i++;

MAS_3[k]= MAS_1[i];

m++;

tt=MAS_1[i];

j=0;

}

}

else // продолжение блока

{

k++;

MAS_3[k]= MAS_2[j];

m++;

j=0;

}

}

j++;

}

cout<<"\n MAS_3 "<<endl;

for(int v = 0; v <=k; v++) cout<<MAS_3[v]<<" ";

return 0;

}