Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопросы по скрипту для шифровки и дешифровки шифра Цезаря. (https://javascript.ru/forum/misc/26676-voprosy-po-skriptu-dlya-shifrovki-i-deshifrovki-shifra-cezarya.html)

andrewvas 17.03.2012 22:13

Вопросы по скрипту для шифровки и дешифровки шифра Цезаря.
 
Вот сам скрипт:
<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="Шифровать">&nbsp;&nbsp;&nbsp;
<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) Как реализовать цикличность, т.е если алфавит заканчивается то скрипт начинает "брать" алфавит сначало.

рони 18.03.2012 04:23

andrewvas,
У вас нет проверки существуетли b_pos +7 или b_pos - 7 плюс i = i+2 в строке 25, нужно i++.

andrewvas 18.03.2012 16:56

спасибо)
Если я выполняю проверку и b_pos+7(b_pos-7) не существует то..?

рони 18.03.2012 18:43

andrewvas,
примерно так
if(b_pos+7>b_alf.length) b_pos-=b_alf.length;
if(b_pos-7<0) b_pos+=b_alf.length;

andrewvas 18.03.2012 22:23

ок спасибо)
только куда это вставить?)
P.S b_pos-=b_alf.length; это тоже самое что b_pos=b_pos-b_alf.length; ?

рони 19.03.2012 08:57

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>

andrewvas 19.03.2012 18:23

Спасибо) А можно небольшие пояснения(в 12, 14 и последующих строках)? в том как скрипт работает) а то я не очень понял(

Tmin10 14.03.2013 19:45

В 12 строке мы вычисляем сдвиг, тут если сдвиг больше 33, то по кругу будет.
В 14 сроке получаем набор символов со сдвигом.

Tmin10 14.03.2013 20:51

Так, а вот что делает код
a = f.charAt(a) || c.charAt(i);
я так и не понял, почему к символам применяется ИЛИ, что оно даёт?

рони 14.03.2013 21:04

Цитата:

Сообщение от Tmin10
a = f.charAt(a) || c.charAt(i);

а первоначально это индекс буквызамены -- если индекса нет -нет такой буквы оставляем символ как он есть без замены


Часовой пояс GMT +3, время: 03:53.