#javascript
Вопрос:
В школе мы должны написать функцию, которая шифровала бы определенное сообщение, перемещая каждую букву сообщения по номеру » nC » (или niveauCryptage) в алфавите.
В настоящее время всякий раз, когда я выполняю код, я застреваю на экране загрузки навсегда после завершения обоих взаимодействий с пользователем (тех, которые запрашивают число, на которое буквы будут сдвинуты в алфавите, и сообщение, которое пользователь хочет зашифровать). Я подозреваю, что что-то не так с петлями.
function crypter(t, l, nC) { //This function receives the alphavet Table, a letter, and the number by which the letter has to be shifted in the alphabet. //This function returns a single crypted letter... var crypte = ''; var i = 0; while (t[i] != l) { i ; } if (i nC gt; t.length) { crypte = (i nC) - (t.length); } else { crypte = i nC; } return crypte; } //Global variables var tAlphaB = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ' ]; var niveauCryptage = 0; var texteBase = ''; var tTexteAvant = new Array(); var tTexteApres = []; var txt = 'Le résultat du cryptage est : nn'; //Main program //Ask the user to specify the number by which the letters of the message have to be shifted in the alphabet //This number has to be a number between 1 and 10 (1 and 10 included) do { niveauCryptage = parseFloat(prompt("Saisissez un nombre entre 1 et 10 pour selectionner le niveau de cryptage")); } while (isNaN(niveauCryptage) || niveauCryptage gt; 10 || niveauCryptage lt; 1) //Ask the user to enter a message on the condition that it is a chain of characters do { texteBase = prompt("Quel texte voudrez-vous crypter?"); } while (!isNaN(texteBase)) //Transform the message into the table tTexteAvant using the split('') function tTexteAvant = new Array(texteBase.split('')); //Encrypt each letter of the table, tTexteAvant, into a new table, tTexteApres var j = 0; while (j lt; tTexteAvant.length) { tTexteApres.push(crypter(tAlphaB, tTexteAvant[j], niveauCryptage)); j ; }
Комментарии:
1. Ваш алфавитный массив содержит только заглавные буквы. Если вы передаете функции строчную букву вместе с прописным алфавитом, это приведет к бесконечному циклу. Кроме того, на самом деле не очень хорошая идея допускать возможность создания бесконечного цикла просто путем передачи различных параметров функции. Я бы либо определил массив как константу внутри функции, либо вызвал глобальную переменную напрямую, вместо того, чтобы ожидать, что она будет передана в качестве параметра.
Ответ №1:
tTexteAvant = new Array(texteBase.split(''));
Будет создан массив с одним элементом, который будет массивом с символами.
Вы, скорее всего, захотите tTexteAvant = texteBase.split('');
Ответ №2:
Как указано в комментарии Джесси, эта часть crypter
функции переходит в бесконечный цикл, когда символа l
нет в массиве, то есть, например, когда он является строчным или знак препинания.
while (t[i] != l) { i ; }
Если вам просто нужно найти, присутствует ли элемент строки в массиве, вы можете заменить эту часть функцией массива, которая находит значение и возвращает индекс в массиве (или -1, если не найден).:
i = t.indexOf(l);
Затем вы должны решить, что делать с недопустимыми или нераспознанными символами, или предложить пользователю ввести допустимую строку (только символы алфавита в верхнем регистре и пробелы). Вы также можете решить преобразовать любые строчные символы в прописные, если это приемлемо.
В качестве примечания проверьте возвращаемое значение crypter
функции: она возвращает новый индекс, а не новую букву. Как было отмечено в начале функции, это не ожидаемое поведение.