Цикл, кажется, никогда не прерывается/система перегружена

#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 функции: она возвращает новый индекс, а не новую букву. Как было отмечено в начале функции, это не ожидаемое поведение.