Словесное описание алгоритма: используется расширенный алфавит ABCDEFGHIJKLMNOPQRSTUVWXYZ!"(),-.?:; Каждый символ входного текста получает номер согласно позиции в расширенном алфавите. Далее с помощью генератора (псевдо)случайных чисел с интервалом от 0 до 36 создается последовательность той же длины, что и входной текст. Затем происходит посимвольное сложение по модулю 36 элементов входного текста и элементов последовательности. Получаемый выходной текст есть закодированный входной текст.
Код процедуры:
int getIntexLetter(System::Char letter, System::String^ aplphabeth){
int ret;
for ( int i = 0; i < aplphabeth->Length; i++ ) if ( letter == aplphabeth[i] ) ret = i;
return ret;
}
System::String^ notepad(System::String^ input){
System::String^ output;
System::String^ alphabeth;
System::Char ch;
input = input->ToUpper();
for ( int i = 0; i < 37; i++ ){
if ( i < 26 ) ch = i + 65;
if ( i == 26 ) ch = '!';
if ( i == 27 ) ch = '"';
if ( i == 28 ) ch = '(';
if ( i == 29 ) ch = ')';
if ( i == 30 ) ch = ',';
if ( i == 31 ) ch = '-';
if ( i == 32 ) ch = '.';
if ( i == 33 ) ch = '?';
if ( i == 34 ) ch = ':';
if ( i == 35 ) ch = ';';
if ( i == 36 ) ch = ' ';
alphabeth = System::String::Concat(alphabeth, ch.ToString());
}
int* code;
code = new int[input->Length];
Random rnd;
for ( int i = 0; i < input->Length; i++ ) code[i] = rnd.Next(37);
for ( int i = 0; i < input->Length; i++ ){
int index = getIntexLetter(input[i], alphabeth);
index += code[i];
if ( index > 36 ) index -= 36;
output = System::String::Concat(output, alphabeth[index].ToString());
}
return output;
}