Timkor

wordsAndFun

Jan 13th, 2021 (edited)
1,022
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Спитайте людину про рядок і виведіть на екран кількість слів у рядку.
  2. Хочемо зауважити, що слово - це послідовність літер. Все, що не-літера - вважається роздільником. */
  3.  
  4. /*рішення працює за умови що введений рядок містить хоча б одну літеру, і не містить кілька роздільників поспіль, як врахувати ці умови поки не вирішив */
  5.  
  6. let userString ;
  7. do {
  8.     userString = prompt('Enter your string')
  9. } while(userString == false); // не впевнений що ця перевірка потрібна, робив щоб не було порожнього рядка
  10. /* while(userString == false) можна записати while(!userString)
  11. *  while(userString == true) можна записати while(userString)
  12. *  але якщо ви не хочете порожний рядок, то можна while(userString == ''), якщо хочете не дозволити натискання ок або кенсел
  13. *  при порожньому полі, то при кенсел повертається спеціальне значення null, при ок - пустий рядок, всі три варіанти js приведе до false якщо записати саме while(!userString)
  14. *
  15. */
  16.  
  17. let separatorCounter = 0;
  18.  
  19. for(let i = 0; i < userString.length; i++) {
  20.     if(((userString.charCodeAt(i) > 65) && (userString.charCodeAt(i) < 91)) ||
  21.          ((userString.charCodeAt(i) > 96) && (userString.charCodeAt(i) < 123))) {
  22.         continue
  23.     } else {
  24.         separatorCounter++
  25.     }
  26. };
  27.  
  28. // чи починається з роздільника
  29. /* можна взяти умову "коли літера" (скопіювати вище) та інвертувати її додавши перед нею знак оклику   :
  30. *  if(!(((userString.charCodeAt(i) > 65) && (userString.charCodeAt(i) < 91)) ||
  31.          ((userString.charCodeAt(i) > 96) && (userString.charCodeAt(i) < 123))))
  32. а краще... гарна можливість застосувати функцію)))
  33.  
  34. */
  35. if ((userString.charCodeAt(0) < 65) || ((userString.charCodeAt(0) > 90) && (userString.charCodeAt(0) < 97)) || (userString.charCodeAt(0) > 122)) {
  36.     separatorCounter--
  37. };
  38.  
  39. // чи закінчується роздільником
  40. 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)) {
  41.     separatorCounter--
  42. };
  43.  
  44. console.log('There are ' + (separatorCounter + 1) + ' words in your string')
  45.  
  46. /*
  47. Нормальний MVP , але давайте напишемо функцію (це просто) яка зробить код читабельнішим та легшим для написання, зручно
  48. буде просто викликати функцію коли нам потрібно знати чи символ чи роздільник якийся символ, а не писати кілометровий іф
  49. пропоную ім'я для функції isLetter - цеБуква?. А як вона буде знати який символ ми хочемо перевірити  - будемо передавати його їй в параметр (це така змінна, наприклад дамо ім'я параметру symb), ну а всю кілометрову перевірку засунемо всередину (в тіло) нашої функції. Тоді для перевірки чи то буква для якогось символу, наприклад 'w' нам потрібно викликати функцію так: isLetter('w') і якщо вона поверне тру - то так, ми передали їй букву, якщо фолс, то роздільник.  
  50. */
  51.  
  52. // ця функція повертає тру (правда) коли отримує букву, або фолс, якщо отримує не букву
  53. function isLetter(symb) { // тут symb це параметра функції, просо кажучи це змінна в яку буде присвоюватися те, що ми
  54. // передамо при виклику функції
  55.     // кілометровий іф по ascii  таблиці для змінної, що прилетіла в наш параметр symb
  56.     if(((symb.charCodeAt(0) > 65) && (symb.charCodeAt(0) < 91)) ||
  57.           ((symb.charCodeAt(0) > 96) && (symb.charCodeAt(0) < 123))) {
  58.          return true; // якщо зайшли до іфу то повертаємо в місто виклику функції тру (якби замість самого виклику)
  59.      } else {
  60.          return false; // якщо в той іф не зайшли  - то фолсе, то не буква
  61.      }
  62. }
  63.  
  64. // не можу втриматися щоб не записати нормально ту саму функцію з тією самою логікою. Це буде так виглядати:
  65. function isLetter(symb) {
  66.     return ((symb.charCodeAt(0) > 65) && (symb.charCodeAt(0) < 91)) ||
  67.           ((symb.charCodeAt(0) > 96) && (symb.charCodeAt(0) < 123))
  68. }
  69. /*
  70. перший запис такий: якщо вираз=тру то повернути тру, інакше повернути фолсе. тобто якщо вираз тру - повертаємо тру, якщо фолсе, то повертаємо фолс. Га? Що ви кажете? Так.. спростимо
  71. другий запис: повернути те, чому рівний вираз (тру або фолс)
  72. */
  73.  
  74. тепер програма буде виглядати так:
  75.  
  76. let userString ;
  77. do {
  78.     userString = prompt('Enter your string');
  79. } while(!userString);
  80.  
  81. let separatorCounter = 0;
  82.  
  83. for(let i = 0; i < userString.length; i++) {
  84.     if(isLetter(userString[i])) { // функція круто, коли багато разів треба щось робити однакове, тобто це ваш робітник
  85.                                   // для виконання якоїсь однакової роботи та можна з різними вхідними даними, а для
  86.                                   // кожного з інших видів робіт створюємо свою окрему функцію, тобто як штукатур, маляр,
  87.                                   // дизайнер, а параметр у кожного наприклад об'єкт що ремонтується, та деяки особисті.
  88.         continue   // брейк це стоп-кран, а контінью це щось на кшталт проїхали, що те що інше можна юзати, але не бажано.
  89.     } else {
  90.         separatorCounter++
  91.     }
  92. };
  93. /* можна так цей блок записати:
  94.  
  95. for(let i = 0; i < userString.length; i++) {
  96.     if(!isLetter(userString[i])) {
  97.         separatorCounter++  // тобто просто підраховуємо кількість роздільників у рядку.
  98.     }
  99. };
  100.  
  101. */
  102.  
  103.  
  104. // чи починається з роздільника
  105. if (!isLetter(userString[0])) { // якщо (не)цеБуква(нульовий симол рядку) . Знак інверсії (! = не) міняє значення, тобто
  106.                                 // якщо функція поверне тру (коли нульова буква) то інверсія зробить з тру фолсе та ми не
  107.                                 // зайдемо до іфу і не зменшимо кількість сепараторів
  108.     separatorCounter--
  109. };
  110.  
  111. // чи закінчується роздільником
  112. if (!isLetter(userString[userString.length - 1])) {
  113.     separatorCounter--
  114. };
  115.  
  116. console.log('There are ' + (separatorCounter + 1) + ' words in your string')
  117.  
  118. function isLetter(symb) {
  119.     return ((symb.charCodeAt(0) > 65) && (symb.charCodeAt(0) < 91)) ||
  120.           ((symb.charCodeAt(0) > 96) && (symb.charCodeAt(0) < 123))
  121. }
  122. /*
  123. УВАГА!!!
  124. якщо хочете придумати свій алгоритм - круто, так і треба, якщо здаєтеся, то читайте далі.. кода не буде, але підказка
  125. щодо алгорітму у псевдокоді буде.
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. пседокод пропоную такий (це той mvp, що можна буде доробити):
  142. отримати рядок
  143. флаг булаБуква (змінна булевого типу) опускаємо (присвоюємо фолс) якщо нульовий символ не буква, або піднімаємо в тру, якщо нульовий символ буква.
  144. йдемо по кожному символу у рядку з першого {  // нульовий вже підняв чи опустив флаг:
  145.     якщо символ == буква {
  146.         якщо булаБуква == фолс {      // можна просто писати якщо !булаБуква, так і будемо робити
  147.                 булаБуква = тру
  148.         }
  149.     } інакше { // сюди зайдемо коли поточний символ рядка не є буква, тобто є роздільником
  150.           якщо булаБуква == true {      // можна просто писати якщо булаБуква, так і будемо робити
  151.                 кількістьСлів++ // тут скінчилося слово що було
  152.                 булаБуква = фолс
  153.            }      
  154.     }  
  155.  }
  156.  
  157. потребує доработки пов'язанної з кінцем рядка, може ще якоїсь -  то все на вас.)        
  158.  
  159. Java вам помститься за відсутність звички ставити крапку з комою в javascript.))
  160. Гарного коду.
  161. */
  162.  
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×