Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Спитайте людину про рядок і виведіть на екран кількість слів у рядку.
- Хочемо зауважити, що слово - це послідовність літер. Все, що не-літера - вважається роздільником. */
- /*рішення працює за умови що введений рядок містить хоча б одну літеру, і не містить кілька роздільників поспіль, як врахувати ці умови поки не вирішив */
- let userString ;
- do {
- userString = prompt('Enter your string')
- } while(userString == false); // не впевнений що ця перевірка потрібна, робив щоб не було порожнього рядка
- /* while(userString == false) можна записати while(!userString)
- * while(userString == true) можна записати while(userString)
- * але якщо ви не хочете порожний рядок, то можна while(userString == ''), якщо хочете не дозволити натискання ок або кенсел
- * при порожньому полі, то при кенсел повертається спеціальне значення null, при ок - пустий рядок, всі три варіанти js приведе до false якщо записати саме while(!userString)
- *
- */
- let separatorCounter = 0;
- for(let i = 0; i < userString.length; i++) {
- if(((userString.charCodeAt(i) > 65) && (userString.charCodeAt(i) < 91)) ||
- ((userString.charCodeAt(i) > 96) && (userString.charCodeAt(i) < 123))) {
- continue
- } else {
- separatorCounter++
- }
- };
- // чи починається з роздільника
- /* можна взяти умову "коли літера" (скопіювати вище) та інвертувати її додавши перед нею знак оклику :
- * if(!(((userString.charCodeAt(i) > 65) && (userString.charCodeAt(i) < 91)) ||
- ((userString.charCodeAt(i) > 96) && (userString.charCodeAt(i) < 123))))
- а краще... гарна можливість застосувати функцію)))
- */
- if ((userString.charCodeAt(0) < 65) || ((userString.charCodeAt(0) > 90) && (userString.charCodeAt(0) < 97)) || (userString.charCodeAt(0) > 122)) {
- separatorCounter--
- };
- // чи закінчується роздільником
- if ((userString.charCodeAt(userString.length - 1) < 65) || ((userString.charCodeAt(userString.length - 1) > 90) && (userString.charCodeAt(userString.length - 1) < 97)) || (userString.charCodeAt(userString.length - 1) > 122)) {
- separatorCounter--
- };
- console.log('There are ' + (separatorCounter + 1) + ' words in your string')
- /*
- Нормальний MVP , але давайте напишемо функцію (це просто) яка зробить код читабельнішим та легшим для написання, зручно
- буде просто викликати функцію коли нам потрібно знати чи символ чи роздільник якийся символ, а не писати кілометровий іф
- пропоную ім'я для функції isLetter - цеБуква?. А як вона буде знати який символ ми хочемо перевірити - будемо передавати його їй в параметр (це така змінна, наприклад дамо ім'я параметру symb), ну а всю кілометрову перевірку засунемо всередину (в тіло) нашої функції. Тоді для перевірки чи то буква для якогось символу, наприклад 'w' нам потрібно викликати функцію так: isLetter('w') і якщо вона поверне тру - то так, ми передали їй букву, якщо фолс, то роздільник.
- */
- // ця функція повертає тру (правда) коли отримує букву, або фолс, якщо отримує не букву
- function isLetter(symb) { // тут symb це параметра функції, просо кажучи це змінна в яку буде присвоюватися те, що ми
- // передамо при виклику функції
- // кілометровий іф по ascii таблиці для змінної, що прилетіла в наш параметр symb
- if(((symb.charCodeAt(0) > 65) && (symb.charCodeAt(0) < 91)) ||
- ((symb.charCodeAt(0) > 96) && (symb.charCodeAt(0) < 123))) {
- return true; // якщо зайшли до іфу то повертаємо в місто виклику функції тру (якби замість самого виклику)
- } else {
- return false; // якщо в той іф не зайшли - то фолсе, то не буква
- }
- }
- // не можу втриматися щоб не записати нормально ту саму функцію з тією самою логікою. Це буде так виглядати:
- function isLetter(symb) {
- return ((symb.charCodeAt(0) > 65) && (symb.charCodeAt(0) < 91)) ||
- ((symb.charCodeAt(0) > 96) && (symb.charCodeAt(0) < 123))
- }
- /*
- перший запис такий: якщо вираз=тру то повернути тру, інакше повернути фолсе. тобто якщо вираз тру - повертаємо тру, якщо фолсе, то повертаємо фолс. Га? Що ви кажете? Так.. спростимо
- другий запис: повернути те, чому рівний вираз (тру або фолс)
- */
- тепер програма буде виглядати так:
- let userString ;
- do {
- userString = prompt('Enter your string');
- } while(!userString);
- let separatorCounter = 0;
- for(let i = 0; i < userString.length; i++) {
- if(isLetter(userString[i])) { // функція круто, коли багато разів треба щось робити однакове, тобто це ваш робітник
- // для виконання якоїсь однакової роботи та можна з різними вхідними даними, а для
- // кожного з інших видів робіт створюємо свою окрему функцію, тобто як штукатур, маляр,
- // дизайнер, а параметр у кожного наприклад об'єкт що ремонтується, та деяки особисті.
- continue // брейк це стоп-кран, а контінью це щось на кшталт проїхали, що те що інше можна юзати, але не бажано.
- } else {
- separatorCounter++
- }
- };
- /* можна так цей блок записати:
- for(let i = 0; i < userString.length; i++) {
- if(!isLetter(userString[i])) {
- separatorCounter++ // тобто просто підраховуємо кількість роздільників у рядку.
- }
- };
- */
- // чи починається з роздільника
- if (!isLetter(userString[0])) { // якщо (не)цеБуква(нульовий симол рядку) . Знак інверсії (! = не) міняє значення, тобто
- // якщо функція поверне тру (коли нульова буква) то інверсія зробить з тру фолсе та ми не
- // зайдемо до іфу і не зменшимо кількість сепараторів
- separatorCounter--
- };
- // чи закінчується роздільником
- if (!isLetter(userString[userString.length - 1])) {
- separatorCounter--
- };
- console.log('There are ' + (separatorCounter + 1) + ' words in your string')
- function isLetter(symb) {
- return ((symb.charCodeAt(0) > 65) && (symb.charCodeAt(0) < 91)) ||
- ((symb.charCodeAt(0) > 96) && (symb.charCodeAt(0) < 123))
- }
- /*
- УВАГА!!!
- якщо хочете придумати свій алгоритм - круто, так і треба, якщо здаєтеся, то читайте далі.. кода не буде, але підказка
- щодо алгорітму у псевдокоді буде.
- пседокод пропоную такий (це той mvp, що можна буде доробити):
- отримати рядок
- флаг булаБуква (змінна булевого типу) опускаємо (присвоюємо фолс) якщо нульовий символ не буква, або піднімаємо в тру, якщо нульовий символ буква.
- йдемо по кожному символу у рядку з першого { // нульовий вже підняв чи опустив флаг:
- якщо символ == буква {
- якщо булаБуква == фолс { // можна просто писати якщо !булаБуква, так і будемо робити
- булаБуква = тру
- }
- } інакше { // сюди зайдемо коли поточний символ рядка не є буква, тобто є роздільником
- якщо булаБуква == true { // можна просто писати якщо булаБуква, так і будемо робити
- кількістьСлів++ // тут скінчилося слово що було
- булаБуква = фолс
- }
- }
- }
- потребує доработки пов'язанної з кінцем рядка, може ще якоїсь - то все на вас.)
- Java вам помститься за відсутність звички ставити крапку з комою в javascript.))
- Гарного коду.
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement