> For the complete documentation index, see [llms.txt](https://shpp.gitbook.io/zero/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shpp.gitbook.io/zero/tutorials/strings.md).

# Рядки

**ВАЖЛИВО: цей розділ не є обов'язковим для дорослих, для проходження вступного тестування Ш++ тому можете переходити до** [**наступної теми**](/zero/tutorials/functions.md)**. Але якщо є час та натхнення — краще почитайте та зробіть задачі ;)**

Для початку згадаємо, що таке рядки, і що з ними можна робити. Що буде, якщо запустити цей код?

```javascript
let a = "hello";
console.log(a);
console.log(a + a);
console.log(a * 2);
```

На цьому прикладі видно, як склеювати рядки і виводити їх на екран. Також, на екран можна виводити конкретний символ в рядку, якщо сприймати текстовий рядок як масив (але все ж таки це не масив!):

```javascript
console.log(a[1]);
console.log(a.length);
```

Іноді буває, що потрібно змінити рядок. Це не так просто: потрібно скопіювати рядок в масив посимвольно і змінювати кожну окрему комірку в масиві.

```javascript
let a = "hello";
let b = [];
// сподіваюсь вам комфортно з for
for (let i = 0; i < a.length; i++) {
    b[i] = a[i];
}
b[3] = "X"; // нарешті можна змінити
```

а потім можна склеїти назад масив символів в рядок

```javascript
let c = "";
for (let i = 0; i < b.length; i++) {
    c = c + b[i];
}
```

подивимось на результат:

```javascript
console.log(c);
```

... а всю цю маніпуляцію ми робимо, тому що рядки — *immutable* (незмінні). А масиви можна змінювати (точніше значення їх комірок)

це треба перевірити:

```javascript
let a = "hello";
a[1] = "x";
console.log(a); // що буде?
```

Взагалі, є варіанти змінити рядок простіше, але ми їх вам не показуємо, тому що всередині вони працюють так само як і варіант вище, просто пишуться по-іншому.

Для того, щоб рухатися далі ─ треба зрозуміти, що таке таблиця [ASCII](https://ru.wikipedia.org/wiki/ASCII) і навіщо вона потрібна. Ось вона:

![](/files/x7pAAkGyrhr8XODXmRjb)

У цій табличці вказані числа, які відповідають символам в рядках. Для комп'ютера все є числами.

Перші числа від 0 до 31 кодують будь-яку дивну штуку, але із знайомого там — код 13 (символ переходу на наступний рядок, зазвичай записується як "\n") і код 9 (табуляція). Втім неважливо. Набагато простіше сприймати коди від 32 до 126 ─ там вже звичні нам символи, від пробілу і знаку оклику до букви z. Після 127 йде темний ліс ─ всілякі закарлючки, російські літери та інше, ми з ними працювати не будемо (поки що).

Розуміючи, що всі літери ─ це числа за фактом, можна з ними робити будь-які маніпуляції. Як перетворити символ в його число-код?

Так, наприклад:

```javascript
let a = "A";
console.log(a.charCodeAt(0)); // напише 65
```

або ж так:

```javascript
console.log("ABC".charCodeAt(1)); // напише 66 (код літери B)
```

... тут 0 або 1 ─ це позиція символу в рядку, для якого ми хочемо отримати код. Виходить `"ABE".charCodeAt(2)` поверне 69

А можна будь-який ASCII-код перетворити назад в символ.

```javascript
console.log(String.fromCharCode(65)); // поверне А
```

... завдяки коду символу, можна легко з'ясувати, чи є цей символ літерою.

Адже насправді все питання в діапазонах, які можна підглянути в таблиці ASCII. Наприклад великі літери починаються з числа 65 і закінчуються ... не пам'ятаю, самі подивіться в таблиці. **Нагадаю, що в задачах Ш++ маються на увазі тільки латинські літери.**

Що цікаво — символам, що позначають числа (наприклад "0") відповідають зовсім інші числа (у "0" код 48, а не 0). До речі код 0 — це взагалі окрема тема, але в javascript з нею практично не стикаються, тому зупинятися на цьому не будемо.

**Робота із рядками може бути набагато простіше, АЛЕ**:

> Ми спеціально не розповідаємо набагато зручніші способи роботи з рядками
>
> Тому що завдання цього етапу — навчити вас користуватися тим, що є.
>
> ...а не магічними функціями, які працюють незрозуміло як і роблять все самі.
>
> Тому що ми не вчимо рядки — насправді ми вчимося писати код і вирішувати ним завдання, а інструменти ви вивчите пізніше
>
> Тому прохання для вирішення задачок не використовувати об'єкти, мепи, різні методи класу String і інші приколи, про які легко дізнатися, якщо погуглити завдання. Ми їх вивчимо пізніше.
>
> Загалом, краще не гуглити нічого додатково. ...просте використання циклів і масивів (за прикладами того що було вгорі показано) 一 ось що ми очікуємо від вас при вирішенні домашніх завдань

Для практики можете написати програму, яка промотує лічильник від 32 до 126 і виводить символи, які відповідають цим кодам через пробіл, c допомогою fromCharCode

## Додаткові матеріали

[Про рядки](https://uk.javascript.info/string) *(uk.javascript.info)*

[Ще про рядки](http://xn--80adth0aefm3i.xn--j1amh/string) *(яваскрипт.укр)*

[Про шаблонні рядки](http://xn--80adth0aefm3i.xn--j1amh/%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BD%D1%96%20%D1%80%D1%8F%D0%B4%D0%BA%D0%B8) *(яваскрипт.укр)*

{% embed url="<https://youtu.be/jc5Upe8xIN0>" %}

## Обов'язкові задачі

Нагадуємо, що "[чіти](https://coremission.net/chity-v-igrah/)" типу `.toLowerCase()` — не можна використовувати в розв'язанні наших задач. Все тому, що завдання створенні, аби вчити вас алгоритміці, а не для проходження "для галочки" ;)

{% content-ref url="/pages/lb9Bq6VQ8ir5EEJVX1Ux" %}
[Кількість слів у рядку](/zero/tutorials/strings/words-counter.md)
{% endcontent-ref %}

{% content-ref url="/pages/HY8vs9wtKgF5F720Rd6S" %}
[Найдовше слово](/zero/tutorials/strings/longest-word.md)
{% endcontent-ref %}

*Виникли питання або труднощі?* [*Зверніться за допомогою до Ш++.*](/zero/arrangements/support.md)
