Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // функції краще винести над соновним кодом програми, принаймні поки що так. До функції також потрібні коментарі.
- /*функція яка перевіряє чи є латинською літерою переданий до неї параметр,
- повертає true якщо літера, false якщо не літера;
- char - символ що перевіряємо. до цього параметру можуть прийматися строкові дані.
- якщо передавати дані інших типів функція викине помилку (throw an exception);
- return true коли літера, false коли не літера;
- */
- function isLetter(char) { // text не добра назва для одного символа, а саме один ми очікуємо, хоча можна і рядок передати, все одна лише нульовий з нього буде перевірятися, та все одно текст - не камільфо.
- let code = char.charCodeAt(0);
- return ((code >= 65 && code <= 90) || (code >= 97 && code <= 122));
- }
- let text = prompt('Введите фразу (латиницей)'); //let text = 'Do not give up, the beginning is always the hardest';
- let count = 0;
- for (let i = 0; i < text.length; i++) { // треба йти до останнього)
- let currentChar = text[i]; // коли вводимо змінні з семантичними іменами, то код стає простіше читати
- let isCurrentCharLast = (i == text.length - 1); // порівняйте читабельність лівої та правої частин цього виразу
- // console.log(text[i] + ' ' + isCurrentCharLast + ' ' + count) // коментар коду що логує, для відладки. Залишив тільки в учбових цілях, зазвичай закоментований код (не плутати з коментарями) не можна лишати в програмі.
- if (isLetter(currentChar) &&
- (isCurrentCharLast || !isLetter(text[i + 1]))) { // спробуйте (!isLetter(text[i + 1]) || isCurrentCharLast))) { та введіть рядок без пробіла в кінці. Важливо розуміти чому послідовність умов важлива тут.
- count += 1;
- }
- }
- console.log(count);
- /* є ще варіант обробляти неіснуючий симол - той що після останнього в рядку , він як undefined передається в функцію. Спосіб простий, дієвий, але менш навчальний за вище приведений. Він полягає в тому, щоб змінити функцію так, щоб вона реагувала на undefined значення без помилки, а просто як не на літреру. Навчити функцію приймати та обробляти undefined значення, що може "прилітіти" (передатися) до параметру функції. Нижче написав таку, але ви легко можете зробити це самостійно, 100% :) */
- // Гарного коду!
- function isLetter(char) {
- if (char == undefined) { /*перевірка на edge case коли до параметру char передасться undefined. Добра практика робити
- такі перевірки (на значення що не є нормальними для функції) на самому початку функуії, і виходити з неї (або повертати вдпоавідне значення) до того як почнеться блок основної логіки. Якщо такий "ранній вихід" з функції не зробити, то основна логіка функції занадто ускладниться обробкою можливого невалідного значення. Приклад такої невдалої реалізації є нижче*/
- return false;
- }
- // основна логіка на валідні значення залишилась як і була - чистою, без додаткових перевірок.
- let code = char.charCodeAt(0);
- return ((code >= 65 && code <= 90) || (code >= 97 && code <= 122));
- }
- /* з такою функцією можна не перевіряти в циклі чи останнім поточний символ */
- // не крутий варіант без раннього вихіду, тільки для ознайомлення, не пишіть так, а пишіть ранній вихід.
- function isLetter(char) {
- let code = 0; // поки ініціалізуємо нулем, але краще присвоїти null, якщо знаєте що це.
- if (char !== undefined) { // змішуємо основну логіку з можливим невалідним значенням
- code = char.charCodeAt(0);
- }
- if(code !== 0) { // або тут на null перевіряти, в будь якому випадку знов забруднили основну логіку перевірками ваділності отриманого до параметру значення.
- return ((code >= 65 && code <= 90) || (code >= 97 && code <= 122));
- }
- return false;
- }
Add Comment
Please, Sign In to add comment