Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Програма для сдвига символов на ную позицию. / 8 сообщений из 8, страница 1 из 1
12.04.2015, 15:49
    #38934180
Кроки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програма для сдвига символов на ную позицию.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
string key=" ";//Существуе переменая типа
string a=" ";//Существуе переменая типа
string c=" ";//Существуе переменая типа
 
cin >> key;//Произведём вод с клавиатуры
 
cin >>a;//Произведём вод с клавиатуры
 
 
int m = key.size();//Найдём длину водимого текса для строки ключа
 
for (i=0;i<<a.size();i++){ //Проиведем сдвиг символом в строке "а" на значение ключа.K
 
int b=key[i]%(m+1);


[img=Kлюч может быть короче текста по этому ограничим его изменения от 0 символа в строке кей[i] до кей[a.size] при
пересечении порога кей[a.size] вернем его значения к 0 символу строки с помощью key[i] mod (m+1).m +1 использум поскольку
когда номер символа ключа будет совпадать с длиной строки, мы вернём значение 0 символа в строке не учтя последний.Т.е
кей[a.size]=7, b[7].7 mod 7=0. При добавлении 1 к длине кей[a.size].7 mod 8=1.При выходе за пределы количества символов строке
ключа 8 mod 8=0 .Т.е 0 символа строки кей[0].]


Код: plaintext
1.
int f=a[i]-128;

Приведём нумерацию символов русского алфавита к классическому нумерованию
(только для верхнего регистра)В ASCII буква А имеет код 128 при классической нумерации от 0 до 31


Код: plaintext
1.
int g=(a[i]+b[i])%32;

По скольку результат сложения может выйти за пределы 31 мы должны возвращать его в эту область
(a[i]+b[i])mod32.Почему берём 32, а не 31.Буква я имеет код 31.Произведём сдвиг буквы Ю на 1 символ.30+1mod 31=0.Вместо
буквы я получим букву А.


Код: plaintext
1.
2.
c.push_back(char(g[i]+128));Выводим символ сдвинутый на значения ключа.
}



Внимание вопрос.При длине ключа меньшей длине водимого текста.
Текст АБВГД
Ключ 123
Получаем БГЕРЕ
Символы Р,Е не соответствует своим реальным значениям при сдвиге.Символ Р получается при сдвиге на мусорное значения позиции.Е при сдвиги на первый символ ключа ,т.е на 1цу.
Хотя по идее int b=key[i]%(m+1) при таком раскладе должен возвращать значение 0,т.е key[i=0] ,что соответствует первому символу в строке кей.
Не ужели нумерация символов в string начинается с 1деницы?
...
Рейтинг: 0 / 0
12.04.2015, 16:34
    #38934214
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програма для сдвига символов на ную позицию.
Кроки,

for (i=0;i<<a.size();i++){ //Проиведем сдвиг символом в строке "а" на значение ключа.

чего куда производим?

тут ты умножаешь i на 2 в степени размера строки a.
...
Рейтинг: 0 / 0
12.04.2015, 16:42
    #38934218
Кроки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програма для сдвига символов на ную позицию.
MasterZiv,
for (i=0;i<<a.size();i++){
int b=key[i]%(m+1);
int f=a[i]-128;
int g=(a[i]+b[i])%32;
c.push_back(char(g[i]+128));
}
По завершению цикла мы получаем сдвиг.Комментарий писал для всего цикла в целом.
...
Рейтинг: 0 / 0
12.04.2015, 18:08
    #38934257
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програма для сдвига символов на ную позицию.
Кроки,

поясни. каждый оператор
...
Рейтинг: 0 / 0
12.04.2015, 18:45
    #38934262
Кроки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програма для сдвига символов на ную позицию.
Под сполерами все объяснения.
...
Рейтинг: 0 / 0
12.04.2015, 19:45
    #38934287
Кроки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програма для сдвига символов на ную позицию.
MasterZiv,если коротко то.Берём первую буквы из строки например А и ключ 1.её код равен 128.Переводим её на расположение в классическом алфавите шифрования f=128-128.Её код становится 0.Рассчитываем сдвиг.Для определения на сколько выполняем сдвиг смотрим в ключ и находим цифру чья позиция в строке совпадает с позицией буквы.Однако ключ бывает короче сообщения.По этому для определения соответствий используем формулу.номер цифры ключа в строке взятый по модулю длина строки +1 b[i]=key.syze %(m+1).+1 используем поскольку при длине ключа в пять символов 1 2 3 4 5 нам необходимо вернуть после выхода за строку к первому символу.Если не прибавлять единицу то вместо 5 символ ключа будет выбран первый.Далее мы определяем позицию буквы при сдвиге как с=f+b. c = 0 +1.Однако для віводам символа Б необходимо вернуть его в юникод символ Б равен с+128.
...
Рейтинг: 0 / 0
13.04.2015, 00:36
    #38934385
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програма для сдвига символов на ную позицию.
Кроки,

ок попробуй заменить

for (i=0;i<<a.size();i++){

на

for (i=0;i<a.size();i++){
...
Рейтинг: 0 / 0
13.04.2015, 11:37
    #38934595
Кроки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програма для сдвига символов на ную позицию.
Проблемы была решена.Шифр Гронсвельда теперь работает.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Програма для сдвига символов на ную позицию. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]