Проверка. Метод террас (квадраты нечётного порядка) <?php$n = 7; // Размерность (нечетное число) $ms = create_magic_square($n);echo '<table>';for($i = 0

Метод террас (квадраты нечётного порядка)

<?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
if($isMS == 4) die("Это <b>магический</b> квадрат <i>(магические строки, столбцы, диагонали)</i>"); /*Функция отдаёт число, обозначающее:1 - не магический квадрат2 - полумагический (только строки и столбцы)3 - диагональный магический квадрат (только диагонали!)4 - магический квадрат (строки, столбцы, диагонали)*/ function is_magic_square($array) { /*Реализация: Веселов Денис.*/ $mag = 2; $left_diagonal = 0; // Идёт справа НА лево $right_diagonal = 0; // Идёт слева НА право for ($i = 1; $i <= $n; $i++) {$row = 0; // ряд $col = 0; // столбец for ($j = 1; $j <= $n; $j++) {$row += $array[$i][$j];$col += $array[$j][$i]; $right_diagonal += ($i == $j)? $array[$i][$j]: 0;$left_diagonal += (($n - $i) == ($j - 1))? $array[$i][$j]: 0;} if (($row!= $m) || ($col!= $m))$mag = 1;} if (($left_diagonal == $m) && ($right_diagonal == $m))$mag += 2; return $mag;} ?>

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<<"Reading complete!\n";
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;
}

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
МИВУ 230105.65
3. Аффинная система Цезаря

 

#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];

// перевод из ансистринг в стринг

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
МИВУ 230105.65
strcpy(S2, S1.c_str());

}

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;

Изм.
Лист
№ докум.
Подпись
Дата
Лист
 
МИВУ 230105.65
for (j = 0; j < strlen(mas); j++) {

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
4.Гаммирование

#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;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: