Вопросы по скрипту для шифровки и дешифровки шифра Цезаря.
Вот сам скрипт:
<html>
<head>
<title>Шифр Цезаря</title> </head>
<body> <br>
<div align="center">
<b>Введите сюда Ваш текст:</b>
<br><br>
<input id="b_text1" type="text" size="80">
<br><br><br>
<b>Выберите действие:</b>
<br><br>
<input onclick="caesar_code(0)" type="button" value="Шифровать">
<input onclick="caesar_code(1)" type="button" value="Дешифровать"> <br><br><br>
<b>Результат:</b> <br><br>
<input id="b_text2" type="text" size="80"> </div>
<script language="JavaScript">
function caesar_code(b_n) {
var b_alf = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', b_result = '', b_x = b_text1.value, b_u =b_text1.value.toUpperCase();
if (b_n == 0) {
for(i = 0; i < b_x.length; i++) {
b_pos = b_alf.lastIndexOf(b_u.charAt(i));
b_char1 = b_alf.charAt(b_pos +7);
b_result = b_result + b_char1 } }
if (b_n == 1) {
for(i = 0; i < b_x.length; i = i+2) {
b_pos = b_alf.indexOf(b_u.charAt(i));
b_result = b_result + b_alf.charAt(b_pos - 7); } }
b_text2.value = b_result; }
</script>
</html>
У меня два вопроса: 1) Почему скрипт дешифрует только один символ? 2) Как реализовать цикличность, т.е если алфавит заканчивается то скрипт начинает "брать" алфавит сначало. |
andrewvas,
У вас нет проверки существуетли b_pos +7 или b_pos - 7 плюс i = i+2 в строке 25, нужно i++. |
спасибо)
Если я выполняю проверку и b_pos+7(b_pos-7) не существует то..? |
andrewvas,
примерно так if(b_pos+7>b_alf.length) b_pos-=b_alf.length; if(b_pos-7<0) b_pos+=b_alf.length; |
ок спасибо)
только куда это вставить?) P.S b_pos-=b_alf.length; это тоже самое что b_pos=b_pos-b_alf.length; ? |
andrewvas,
Вариант с возможностью добавления любых символов для шифрования с возможностью выбора любого положительного сдвига, плюс если символ "нешифруемый" он остаётся таким же(регистр по прежнему верхний, но его можно убрать если добавить символы нижнего регистра)...
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
<title>Шифр Цезаря</title>
<script type="text/javascript">
function caesar_code(a, d) {
var c = document.getElementById("b_text1"),
g = document.getElementById("b_text2"),
b = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
e = "",
d = d % b.length || 0,
c = c.value.toUpperCase(),
f = b.substr(d) + b.substr(0, d);
1 == a && (a = b, b = f, f = a);
for (i = 0; i < c.length; i++) a = b.lastIndexOf(c.charAt(i)), a = f.charAt(a) || c.charAt(i), e += a;
g.value = e
};
</script>
</head>
<body>
<br>
<div align="center">
<strong>Введите сюда Ваш текст:</strong><br>
<br>
<input id="b_text1" type="text" size="80"><br>
<br>
<br>
<strong>Выберите действие:</strong><br>
<br>
<input onclick="caesar_code(0,7)" type="button" value="Шифровать">
<input onclick="caesar_code(1,7)" type="button" value="Дешифровать">
<br>
<br>
<br>
<strong>Результат:</strong><br>
<br>
<input id="b_text2" type="text" size="80">
</div>
</body>
</html>
|
Спасибо) А можно небольшие пояснения(в 12, 14 и последующих строках)? в том как скрипт работает) а то я не очень понял(
|
В 12 строке мы вычисляем сдвиг, тут если сдвиг больше 33, то по кругу будет.
В 14 сроке получаем набор символов со сдвигом. |
Так, а вот что делает код
a = f.charAt(a) || c.charAt(i);я так и не понял, почему к символам применяется ИЛИ, что оно даёт? |
Цитата:
|
Спасибо, теперь понял, уже подумывал о логической операции ИЛИ с символами...
|
| Часовой пояс GMT +3, время: 08:51. |