Timkor

wordsAndFun

Jan 13th, 2021 (edited)
873
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