# Рядки

**ВАЖЛИВО: цей розділ не є обов'язковим для дорослих, для проходження вступного тестування Ш++ тому можете переходити до** [**наступної теми**](/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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://shpp.gitbook.io/zero/tutorials/strings.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
