Timkor

wordsAlenka500

Aug 10th, 2021 (edited)
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // функції краще винести над соновним кодом програми, принаймні поки що так. До функції також потрібні коментарі.
  2.  
  3. /*функція яка перевіряє чи є латинською літерою переданий до неї параметр,
  4.   повертає true якщо літера, false якщо не літера;
  5.   char - символ що перевіряємо. до цього параметру можуть прийматися строкові дані.
  6.   якщо передавати дані інших типів функція викине помилку (throw an exception);
  7.   return true коли літера, false коли не літера;
  8. */
  9. function isLetter(char) { // text не добра назва для одного символа, а саме один ми очікуємо, хоча можна і рядок передати, все одна лише нульовий з нього буде перевірятися, та все одно текст - не камільфо.
  10.     let code = char.charCodeAt(0);
  11.     return ((code >= 65 && code <= 90) || (code >= 97 && code <= 122));
  12. }
  13.  
  14. let text = prompt('Введите фразу (латиницей)'); //let text = 'Do not give up, the beginning is always the hardest';
  15. let count = 0;
  16. for (let i = 0; i < text.length; i++) { // треба йти до останнього)
  17.     let currentChar = text[i]; // коли вводимо змінні з семантичними іменами, то код стає простіше читати
  18.     let isCurrentCharLast = (i == text.length - 1); // порівняйте читабельність лівої та правої частин цього виразу
  19.     // console.log(text[i] + ' ' + isCurrentCharLast + ' ' + count) // коментар коду що логує, для відладки. Залишив тільки в учбових цілях, зазвичай закоментований код (не плутати з коментарями) не можна лишати в програмі.
  20.     if (isLetter(currentChar) &&
  21.      (isCurrentCharLast || !isLetter(text[i + 1]))) { // спробуйте (!isLetter(text[i + 1]) || isCurrentCharLast))) { та введіть рядок без пробіла в кінці. Важливо розуміти чому послідовність умов важлива тут.
  22.         count += 1;
  23.     }
  24. }
  25.  
  26. console.log(count);
  27.  
  28. /* є ще варіант обробляти неіснуючий симол - той що після останнього в рядку , він як undefined передається в функцію. Спосіб простий, дієвий, але менш навчальний за вище приведений. Він полягає в тому, щоб змінити функцію так, щоб вона реагувала на undefined значення без помилки, а просто як не на літреру. Навчити функцію приймати та обробляти undefined значення, що може "прилітіти" (передатися) до параметру функції. Нижче написав таку, але ви  легко можете зробити це самостійно, 100% :) */
  29.  
  30. // Гарного коду!
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61. function isLetter(char) {
  62.     if (char == undefined) { /*перевірка на edge case коли до параметру char передасться undefined. Добра практика робити
  63.     такі перевірки (на значення що не є нормальними для функції) на самому початку функуії, і виходити з неї (або повертати вдпоавідне значення) до того як почнеться блок основної логіки. Якщо такий "ранній вихід" з функції не зробити, то основна логіка функції занадто ускладниться обробкою можливого невалідного значення. Приклад такої невдалої реалізації є нижче*/
  64.         return false;
  65.     }
  66.     // основна логіка на валідні значення залишилась як і була - чистою, без додаткових перевірок.
  67.     let code = char.charCodeAt(0);
  68.     return ((code >= 65 && code <= 90) || (code >= 97 && code <= 122));
  69. }
  70. /* з такою функцією можна не перевіряти в циклі чи останнім поточний символ */
  71.  
  72. // не крутий варіант без раннього вихіду, тільки для ознайомлення, не пишіть так, а пишіть ранній вихід.
  73. function isLetter(char) {
  74.     let code = 0; // поки ініціалізуємо нулем, але краще присвоїти null, якщо знаєте що це.
  75.     if (char !== undefined) { // змішуємо основну логіку з можливим невалідним значенням
  76.        code = char.charCodeAt(0);
  77.     }
  78.     if(code !== 0) { // або тут на null перевіряти, в будь якому випадку знов забруднили основну логіку перевірками ваділності отриманого до параметру значення.
  79.         return ((code >= 65 && code <= 90) || (code >= 97 && code <= 122));
  80.     }
  81.     return false;
  82. }
Add Comment
Please, Sign In to add comment