Метод террас (квадраты нечётного порядка)
<?php $n = 7; // Размерность (нечетное число) $ms = create_magic_square($n);echo '<table>';for($i = 0; $i < $n; $i++) {echo '<tr>';for($j = 0; $j < $n; $j++)echo '<td align="center"> '.$ms[$i][$j].' </td>';echo "</tr>";}echo '</table>'; // функция отдаёт двумерный массив размерности NxN function create_magic_square($N) {$sol = array();$ss = (($N-1)/2);$nn = 1;for($i=0; $i<$N; $i++)for($j=0; $j<$N; $j++) {$x = (-$ss+$i+$j+$N) % $N;$y = ($ss+$i-$j+$N) % $N;$sol[$x][$y] = $nn++;} return $sol;} ?><?php $n = 7; // Размерность (нечетное число) // Генератор пробелов function spaces($n) { $buf = ""; for($i = 0; $i < $n; $i++) $buf.= " "; return $buf; }Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
МИВУ 230105.65 |
$ms = create_square_method_terraces($n);$maxlen = strlen($ms[$n - 1][$n - 1]);for($i = 0; $i < $n; $i++) {for($j = 0; $j < $n; $j++)echo $ms[$i][$j]. spaces($maxlen - strlen($ms[$i][$j]) + 2);echo "<br><br>";} // функция отдаёт двумерный массив размерности NxN function create_square_method_terraces($n) {$square = array(); // создание ступенчатой симметричной фигуры $num = 1;$glob_i = round($n / 2);$glob_j = 2 - $glob_i; while ($num < ($n * $n)) {$i = $glob_i;$j = $glob_j; while(($i + 1)!= $glob_j) {$square[$i][$j] = $num;$num++;$i--;$j++;} $glob_i++;$glob_j++;} // заполнение левой части квадрата, относительно// левой диагонали (саму диагональ не трогаем) $glob_i = 1;$glob_j = $n; while(($glob_i <= ($n - 1)) && ($glob_j >= 2)) {for ($j = 1; $j <= $glob_j; $j++) {if (!isset($square[$glob_i][$j])) {if (isset($square[$glob_i + $n][$j])) {$square[$glob_i][$j] = $square[$glob_i + $n][$j];unset($square[$glob_i + $n][$j]);} else {$square[$glob_i][$j] = $square[$glob_i][$j + $n];unset($square[$glob_i][$j + $n]);}}}
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
МИВУ 230105.65 |
$glob_i++;$glob_j--;} // заполнение правой части квадрата, относительно// левой диагонали (саму диагональ не трогаем) $glob_j = $n - 2; for ($i = $n; $i >= 2; $i--) {for ($j = $n; $j >= ($n - $glob_j); $j--) {if (!isset($square[$i][$j])) {if (isset($square[$i - $n][$j])) {$square[$i][$j] = $square[$i - $n][$j]; unset($square[$i - $n][$j]);} else {$square[$i][$j] = $square[$i][$j - $n];unset($square[$i][$j - $n]);}}} $glob_j--;} foreach ($square AS $k => $v) {if (sizeof($v) == 0) {unset($square[$k]);}} return $square;} ?>
Проверка
<?php $n = 7; // Размерность (нечетное число) $m = $n * ($n * $n + 1) / 2; // Магическая константа // Получение магического квадрата в виде двумерного массива,// например из функции, что находится выше $chkarr = create_magic_square($n); $isMS = is_magic_square($chkarr);if($isMS == 1) die("Это <b>не магический</b> квадрат");if($isMS == 2) die("Это <b>полумагический</b> квадрат <i>(магические только строки и столбцы)</i>");if($isMS == 3) die("Это <b>диагональный магический</b> квадрат <i>(магические только диагонали)</i>");Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
МИВУ 230105.65 |
2.
Изм.
Лист
№ докум.
Подпись
Дата
Лист
Шифр Цезаря (Реализация на С++) МИВУ 230105.65
//Программа шифрования/дешифрования символов латиницы алгоритмом Цезаря
#include <iostream>
#include <string>
#include <conio.h>
#include <stdlib.h>
#include <sstream>
#include <fstream>
using namespace std;
int main()
{
int k; //Переменная выбора - шифрование/дешифрование
int shift; //Величина сдвига
string result = ""; //Строка - результат
cout<<"Enter 1 for encryption and decryption of 2\n";
cin>>k;
switch (k) //Если k
{
case 1: //Если выбрано шифрование
{
cout<<"Enter value shift for encryption\n";
cin>>shift;
if (shift > 26)
shift = shift % 26; //Вычисление сдвига
cout<<"Read of file...\n";
setlocale(LC_ALL,"Russian");//Чтение файла
string s; //Строка считанная из файла
ifstream in("Test.txt");
getline(in,s);
cout<<"Text of file: \n"<<s<<endl;
in.close();
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
МИВУ 230105.65 |
cout<<"Encryption...\n";
for (int i = 0; i < s.length(); i++)
{
//Если не латиница
if (((int)(s[i]) < 65)||((int)(s[i]) > 122))
result += s[i];
//Если буква является строчной
if (((int)(s[i]) >= 97) && ((int)(s[i]) <= 122))
{
//Если буква, после сдвига выходит за пределы алфавита
if ((int)(s[i]) + shift > 122)
//Добавление в строку результатов символ
result += (char)((int)(s[i]) + shift - 26);
//Если буква может быть сдвинута в пределах алфавита
else
//Добавление в строку результатов символ
result += (char)((int)(s[i]) + shift);
}
//Если буква является прописной
if (((int)(s[i]) >= 65) && ((int)(s[i]) <= 90))
{
//Если буква, после сдвига выходит за пределы алфавита
if ((int)(s[i]) + shift > 90)
//Добавление в строку результатов символ
result += (char)((int)(s[i]) + shift - 26);
//Если буква может быть сдвинута в пределах алфавита
else
//Добавление в строку результатов символ
result += (char)((int)(s[i]) + shift);
}
}
Изм.
Лист
№ докум.
Подпись
Дата
Лист
МИВУ 230105.65
cout<<"Encryption complete!\n";
cout<<"Result:\n";
cout<<result; //Вывод результата
break;
}
case 2: //Если выбрано дешифрование
{
cout<<"Enter value shift for decryption\n";
cin>>shift;
if (shift > 26)
shift = shift % 26;
cout<<"Read of file...\n";
setlocale(LC_ALL,"Russian");
string s;
ifstream in("Test.txt");
getline(in,s);
cout<<"Text of file: \n"<<s<<endl;
in.close();
cout<<"Reading complete!\n";
cout<<"Decryption...\n";
for (int i = 0; i < s.length(); i++)
{
//Если не латиница
if (((int)(s[i]) < 65)||((int)(s[i]) > 122))
result += s[i];
//Если буква является строчной
if (((int)(s[i]) >= 97) && ((int)(s[i]) <= 122))
{
//Если буква, после сдвига выходит за пределы алфавита
if ((int)(s[i]) - shift < 97)
//Добавление в строку результатов символ
result += (char)((int)(s[i]) - shift + 26);
Изм.
Лист
№ докум.
Подпись
Дата
Лист
//Если буква может быть сдвинута в пределах алфавита МИВУ 230105.65
else
//Добавление в строку результатов символ
result += (char)((int)(s[i]) - shift);
}
//Если буква является прописной
if (((int)(s[i]) >= 65) && ((int)(s[i]) <= 90))
{
//Если буква, после сдвига выходит за пределы алфавита
if ((int)(s[i]) - shift < 65)
//Добавление в строку результатов символ
result += (char)((int)(s[i]) - shift + 26);
//Если буква может быть сдвинута в пределах алфавита
else
//Добавление в строку результатов символ
result += (char)((int)(s[i]) - shift);
}
}
cout<<"Decryption complete!\n";
cout<<"Result:\n";
cout<<result; //Вывод результата
break;
}
default: //Если ошибочное значение
{
cout<<"Error value\n";
break;
}
}
getch();
return 0;
}
Изм.
Лист
№ докум.
Подпись
Дата
Лист
3. Аффинная система Цезаря МИВУ 230105.65
#include <vcl.h> #pragma hdrstop #include <iostream.h> #include <fstream.h> #include <string.h> #include <stdio.h> #include <fcntl.h> #include <dos.h> #include <io.h> #include <cmath> #pragma hdrstop #include "Unit3.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm3 *Form3; int a,b; // ключи задаваемые пользователем char mas[] ={'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я','а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'}; char shifr[66]; // в этом массиве будет зашифрованный алфавит char str[66]; // запасной массив для строки из memo1 (возможно не нужный) char str2[66]; char deshifr[66]; //--------------------------------------------------------------------------- __fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm3::ШифрацияClick(TObject *Sender) { Memo2->Clear(); AnsiString S1; char S2[256]; int j,i,n,k; for (int j = 0; j < strlen(mas); j++) { shifr[j] = mas[(b+a*j) % strlen(mas)]; // формула по которой происходит шифрование } n=Form3->Memo1->Lines->Count; for(j=0;j<n;j++) { S1=Form3->Memo1->Lines->Strings[j]; // перевод из ансистринг в стринг
} for (i=0; i < strlen(S2); i++) str[i]=S2[i]; for (i=0; i < strlen(S2); i++) { for (k=0; k < strlen(mas); k++) { if (str[i] == mas[k]) { str[i] = shifr[k]; k++; } } } for (i=0; i < strlen(S2); i++) S2[i]=str[i]; S1=AnsiString(S2); Form3->Memo2->Lines->Add(S1); Зашифрованно->Visible=true; Расшифрованно->Visible=false; } //--------------------------------------------------------------------------- void __fastcall TForm3::FormCreate(TObject *Sender) { Memo1->Clear(); Memo2->Clear(); Edit1->Clear(); Edit2->Clear(); } //--------------------------------------------------------------------------- void __fastcall TForm3::Button1Click(TObject *Sender) { AnsiString str1 = Form3->Edit1->Text; AnsiString str2 = Form3->Edit2->Text; a = StrToInt(str1); b = StrToInt(str2); // проверка введеных данных // Form3->Memo1->Lines->Add(a); // Form3->Memo2->Lines->Add(b); Edit1->Enabled=false; Edit2->Enabled=false; Button1->Enabled=false; } //--------------------------------------------------------------------------- void __fastcall TForm3::ДешифрацияClick(TObject *Sender) { Memo2->Clear(); AnsiString S3; char S4[256]; int j,i,n,k;
deshifr[j] = shifr[ (j-b)/a % strlen(mas)]; // формула по которой происходит дешифрование } n=Form3->Memo1->Lines->Count; for(j=0;j<n;j++) { S3=Form3->Memo1->Lines->Strings[j]; strcpy(S4, S3.c_str()); } for (i=0; i < strlen(S4); i++) str2[i]=S4[i]; for (i=0; i < strlen(S4); i++) { for (k=0; k < strlen(mas); k++) { if (str2[i] == shifr[k]) { str2[i] = deshifr[k]; k++; } } } for (i=0; i < strlen(S4); i++) S4[i]=str2[i]; S3=AnsiString(S4); Form3->Memo2->Lines->Add(S3); Зашифрованно->Visible=false; Расшифрованно->Visible=true; } |
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
МИВУ 230105.65 |
#include <iostream>
#include "stdafx.h"
#include <locale.h>
#include <string.h>
#include<conio.h>
#include<stdio.h>
#include <stdlib.h>
const int MAX=1000; // MAX - Максимальное количество символов
// PrintLine - Функция печати строки длиной в 'b' символов
void PrintLine(char *line, int b)
{
for (int i=0; i<b; i++)
printf("%c", line[i]);
printf(" \n ");
}
//Функция для шифрования данных
void shifrovanie(char *first, char *late, int y, int n)
{
srand(n); // Инициализация секретного ключа 'n'
unsigned short Gamma; // Гамма
int SizeLateBlock; // Размер последнего блока
unsigned short Block1, Block2; // Блоки, которые будут использованы в качестве буфера обмена
int x; // x - Количество блоков памяти
x=y/1; // Количество блоков памяти по 1 байт
if (x*1!=y) // Проверка количества блоков по 1 байт
{
SizeLateBlock=1; // Если есть лишний блок, то его размер - 1 байт
x++; // Увеличиваем кол-во итераций цикла (для обработки последнего блока размером 1 байт)
}
else SizeLateBlock=1;
for (int i=1; i<=x; i++)
{
Gamma=rand(); // Генерируем гамму с помощью генератора псевдослучайных чисел
unsigned short Mask=0x8000; // Маска для сохранения одного старшего бита
if (i!=x) // Проверка, является ли обрабатываемый блок последним
{
memcpy(&Block1, first+(i-1), 1); // Копирование блока исходных данных размером 1 байт из исходной строки в буферный блок данных
Block2=Block1^Gamma; // Наложение гаммы на буферный блок данных, используя операцию поразрядного исключающего "ИЛИ"
Block1=Block2 & Mask; // Наложение маски, чтобы выделить отдельные биты и сохранить их в отдельном буферном блоке
Block1>>=14; // Выполнениеоперации поразрядного сдвига на 14 бит вправо
Block2<<=2; // Выполнение операции поразрядного сдвига на 2 бита влево
Block2|=Block1; // Использование операции поразрядного "ИЛИ", получение поразрядно сдвинутого на 2 бита влево исходного блока с наложенной гаммой
memcpy(late+(i-1), &Block2, 1); // Копирование результата из буфера в блок с зашифрованными данными
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
МИВУ 230105.65 |
else // Если блок последний
{
if (SizeLateBlock==1)
Mask>>=4; // Сдвиг маски, если размер последнего блока данных - 1 байт
Block1=0; // Далее те же операции, но с учетом того, что идет обработка одного или двух байтов
memcpy(&Block1, first+(i-1), SizeLateBlock);
Block2=Block1^Gamma;
Block1=Block2 & Mask;
Block1>>=(14-4*(1-SizeLateBlock)); // Учитывание размера последнего блока
Block2<<=2;
Block2 = Block1;
memcpy(late+(i-1), &Block2, SizeLateBlock);
}
}
}
//Функция для расшифровывания данных
using namespace std;
void deshifrovanie(char *late, char *first, int y, int n)
{
srand(n); // Инициализация секретного ключа
unsigned short Gamma; // Гамма
int x; // x - Количество блоков памяти
int SizeLateBlock; // Размер последнего блока
unsigned short Block1, Block2; // Блоки, которые будут использованы в качестве буфера обмена
x=y/1; // Количество блоков памяти по 1 байт
if (x*1!=y) // Проверка количества блоков по 1 байт
{
SizeLateBlock=1; // Если есть лишний блок, то его размер - 1 байт
x++; // Увеличивание кол-ва итераций цикла(для обработки последнего блока размером 1 байт)
}
else SizeLateBlock=1;
for (int i=1; i<=x; i++)
{
Gamma=rand(); // Генерация гаммы с помощью генератора псевдослучайных чисел
unsigned short Mask=0x0001; // Маска для сохранения двух младших битов
if (i!=x) // Проверка, является ли обрабатываемый блок последним
{
memcpy(&Block1, late+(i-1), 1); // Копирование блока зашифрованных данных размером 1 байт из исходной строки в буферный блок данных
Block2=Block1 & Mask; // Наложение маски, чтобы выделить отдельные биты и сохранить их в отдельном буферном блоке
Block2<<=14; // Выполнение операции поразрядного сдвига на 14 бит влево
Block1>>=2; // Выполнение операции поразрядного сдвига на 2 бита вправо
Block1|=Block2; // Использование операции поразрядного "ИЛИ", получение поразрядно сдвинутого на 1 бит вправо исходного блока зашифрованных данных
Block2=Block1^Gamma; // Наложение гаммы, используя операцию поразрядного исключающего "ИЛИ", и получаем блок исходных данных
memcpy(first+(i-1), &Block2, 1); // Копирование результата из буфера в блок с расшифрованными данными
}
else
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Лист |
МИВУ 230105.65 |
Block1=0; // Далее те же операции, что и при выполнении условия, с учетом того, что идет обработка одного или двух байтов
memcpy(&Block1, late+(i-1), SizeLateBlock);
Block2=Block1 & Mask;
Block2<<=(14-4*(1-SizeLateBlock)); // Учитываем размер последнего блока
Block1>>=2;
Block1|=Block2;
Block2=Block1^Gamma;
memcpy(first+(i-1), &Block2, SizeLateBlock);
}
}
}
//Главная функция
int main()
{
setlocale(LC_ALL, "rus");
int Key; // Key - Секретный ключ
char Original[MAX], Encrypt[MAX], Decrypt[MAX]; // Original - Исходные, Encrypt - Зашифрованные, Decrypt - Расшифрованные
int a;
printf("Введите данные, которые вы хотите зашифровать: ");
gets(Original); // Ввод исходных данных
a=strlen(Original); // Длина строки
printf("Введите ключ: ");
scanf("%d", &Key); // Ввод секретного ключа
shifrovanie(Original, Encrypt, a, Key); // Шифрование исходных данных
printf(" \n Зашифрованные данные: ");
PrintLine(Encrypt, a); // Вывод зашифрованных данных на экран
printf(" \n Введите ключ: ");
scanf("%d", &Key); // Ввод секретного ключа
srand(Key);
deshifrovanie(Encrypt, Decrypt, a, Key); // Расшифровывание зашифрованных данных
printf(" \n Расшифрованные данные: ");
PrintLine(Decrypt,a); //Вывод расшифрованных данных
getch();
return 0;
}