- •Оглавление
- •1. Вычисление нод алгоритмом Евклида
- •2. Нахождение нод и нок
- •3. Вычисление факториала
- •4. Вычисление факториала рекурсивно
- •5. Вычисление биноминального коэффициента
- •7. Разложение целого числа на сумму биноминальных коэффициентов
- •8. Сумма некоторых элементов массива
- •9. Модификация массива данных. Вариант 1.
- •10. Модификация массива данных. Вариант 2.
- •11. Работа с числами массива
- •12. Поиск совпадений чисел в массиве
- •13. Растяжение списка и вставка, удаление из списка и сжатие. Вариант 1.
- •14. Растяжение списка и вставка, удаление из списка и сжатие. Вариант 2.
- •15. Подсчет количества цифр в целом числе
- •16. Проверка целого числа на симметрию цифр. Вариант 1.
- •17. Проверка целого числа n на симметрию цифр Вариант 2.
- •19. Программа проверки глубины вложения скобок
- •20. Формирование двумерного массива
- •21. Вычисление определителя матрицы второго порядка
- •22. Вычисление определителя матрицы 3 - го порядка
- •23. Нахождение обратной перестановки и по ней циклической формы
- •24. Сортировка простыми вставками
- •25. Сортировка алгоритмом Шелла
- •26. Быстрая сортировка Хоора
- •27. Поразрядная сортировка
- •28. Cортировка 1 методом пузырька
- •29. Cортировка 2 методом пузырька
- •30. Построение 2 обратной и циклической формы перестановки
- •31. Работа с библиотечными карточками
- •32. Работа с конструктором и деструктором
- •33. Работа с комплексными числами
- •34. Работа_1 с комплексными числами через указатели
- •35. Работа_2 с комплексными числами через указатели
- •36. Построение циклической очереди статическое распределение памяти
- •37. Построение стека символов статическое распределение памяти
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;
}
