03 [FreeBASIC] Текстовые переменные и операции с ними
http://ipic.su/img/img7/fs/freebas3.1527601374.jpg
Если операции с числами знакомы нам с детства, то операции с текстовыми строками это что-то новенькое. Есть у нас например текстовая переменная A$(или несколько A$, B$, C$ ...) что вообще с ними можно делать?
Функции и операции со строками не появились ведь просто так))) Программисты решая разные задачи прибегали к решению более мелких задач, порой одинаковых. И для облегчения себе жизни придумали такие вот функции для Бейсика. Есть они и в других языках и даже их там стало больше. Рассмотрим основные.
## Функция LEN(A$)
Например очень часто нужно узнать длину текстовой переменной(длину строки) для этого есть функция.
Код `print len(a$)` выведет на экран длину(количество символов) текстовой переменной `a$`. Длина - это количество памяти(байт) которые отведены под переменную(строку). Символы пробел, точка, запятая, и т.д. ведь тоже занимают место, а следовательно так же идут в счёт. Название функции произошло от английского слова `length` - длина, и во многих других языках Паскаль, С/С++ она носит полное имя, в Бейсике же ограничились более коротким - **len**.
## Объединение строк
Если мы напишем так `C$=A$+B$`? что произойдёт? Строки соединятся - к строке `A$` допишется(прибавится) значение переменной `B$` и результат поместится в переменную `C$`
`A$="Free"`
`B$="BASIC"`
`C$=A$+B$`
`print C$`
http://ipic.su/img/img7/fs/101.1527625191.jpg
не забываем просить FreeBASIC работать в режиме QuickBasic #lang "qb" в начале программы
Или же ~~пытаемся жить по новому и~~ объявляем переменные и их тип в начале программы
`Dim As String a, b, c`, но тогда прийдется поубирать суффиксы `$`с переменных `A$, B$, C$`
http://ipic.su/img/img7/fs/102.1527625623.jpg
Как думаете что выведет оператор print в этой программе?
`A$="12"`
`B$="1"`
`C$=A$+B$`
`print C$`
13? )) Напомню, что в строковых переменных хранятся символы, не числа.
## VAL(A$) и STR$(k) преобразование строки в число и числа в строку
А если надо узнать какое же число хранится в строковой переменной, если оно там хранится?
Для этого есть оператор **val** который при использовании с переменной A$ вернет её значение.
В последнем примере `print val(A$)` выдаст 12, и 12 здесь уже будет число. Ну вернее говоря `print val(A$)` выдаст на экран всё таки текст, а вот получит от val число. Можно использовать например так: `p=val(A$)`, p здесь числовая переменная и она будет равна 12.
Есть функция и обратная к функции Val - это функция str$, которая из числа может сделать строку.
Используют так: `k$=str$(34+5)`, в результате в переменную `k$` будет занесён текст "39"
Говорить что при `A$="12"` в память компьютера запишутся символы 1 и 2 не совсем верно. На самом деле в память запишутся числа 49 и 50. Если взять и "залезть" в память компьютера, именно в те ячейки памяти где хранится переменная `A$`, а такие средства есть, и они используются для отладки программы. Отладка - это поиск ошибок в программе, когда программа не работает, или работает, но не так как нужно. В первом случае программа выдаст ошибку и не запустится - это синтаксическая ошибка, во втором - логическая, т.е. с точки зрения Бейсика программа составлена верно, запустилась и работает, но работает она не так как нужно.
Так вот, в памяти мы увидим 49 и 50, а не 1 и 2. Это потому что в память записываются коды символов "1" это 49 и "2" это 50. Я помню, что код символа "А" например 65, а код "Z" - 90, для "a" это 97, .... Эти коды я не заучивал, это и не нужно - они есть в специальной таблице, они просто сами запомнились, от частого использования в своё время.
А всё потому что компьютер работает с цифрами и на языке цифр ему проще объяснить что и как делать. На первом примере использования этих функций в программе вы увидите - так удобней и программисту, а не только компьютеру)))
## Функции Asc(символ) и Chr$(число)
`Asc(символ)` дает код символа из таблицы символов, а `Chr$(число)` наоборот - даёт символ с определённым кодом.
`print chr$(50)` выдаст "2",
а
`print chr$(49)` выдаст "1",
ну а раз строки можно объединять, то
`print chr$(49)+chr$(50)` выдаст "12"
Аналогично
`print asc("%")` выдаст код символа процент("%") - 37.
## Функции LEFT$, RIGHT$, MID$ и функция поиска INSTR
LEFT$(a$, n) - возвращает n левых символов от строки a$
RIGHT$(a$, n) - возвращает n правых символов от строки a$
MID$(a$, n, k) - возвращает k символов от строки a$ начиная с позиции n
например `b$="12345"`
тогда `LEFT$(b$, 2)` выдаст `"12"`, `RIGHT$(b$, 4)` выдаст `"2345"`, а `MID$(b$, 3, 1)` выдаст `"3"`
MID$(a$, n, k) это не только функция(которая возвращает значение), но это ещё и оператор, который что-то делает.
Код `MID$(b$, 3, 1)="0"` изменит строку b$
Всё зависит от того, с какой стороны от знака равенства стоит MID$
`instr(a$,5,3,"Do")` ищет в строке a$ третье вхождение подстроки "Do" и возвращает его найденную позицию.
## Ещё некоторые функции для работы со строками
|Функция|Действие|
|--|--|
| LCase(*строка*) | переводит *строку* в нижний регистр |
| UCase(*строка*) | переводит *строку* в верхний регистр |
| LTrim(*строка*) | возвращает строку состоящую из исходной, но без пробелов слева |
| RTrim(*строка*) | возвращает строку состоящую из исходной, но без пробелов справа |
| Trim(*строка*) | возвращает строку состоящую из исходной, но без пробелов справа и слева |
| Space(k) | возвращает строку состоящую из k пробелов |
| String(k, c) | возвращает строку состоящую из k символов с кодом c |
Функции семейства trim могут вырезать не только пробелы, но и целые наборы символов(подстроки). Более подробно можно почитать о них [здесь](http://users.freebasic-portal.de/freebasicru/helprus/00index.html)
Таблица называется ASCII (American standard code for information interchange) американский стандартный код для обмена информацией.
Каждому числу от 0 до 255 соответствует свой символ печатный, или не печатный(управляющий). Управляющий это для принтеров и прочих печатных устройств. А где же русские, вернее кириллические, символы? Вторая часть таблицы особым программным образом переключалась на символы национальных алфавитов и тогда появлялись "наши" буковки. Но беда в том, что таких таблиц для русских букв было как минимум две и иногда вместо букв выскакивала непонятная кашица из символов. А потом появилась ещё и Windows там ещё было с таблицей по другому.
Первая часть коды до 127
http://ipic.su/img/img7/fs/p1.1527644308.jpg
вторая часть коды от128
http://ipic.su/img/img7/fs/p2.1527644407.jpg
Есть в этой таблице и специальные символы - сердечки, карточные масти и символы псевдографики, для рисования таблиц на экране (коды 179-218) Сначала ведь не было графики на экране, экран мог только отображать символы - A,B,... А это такие же символы, и с помощью их "рисовалась", ой, простите, печаталась таблица на экране.
Заметили что в некоторых функциях есть суффикс `$`, а в некоторых нет? Если есть значит функция возвращает строку? например `chr$(179)`, если нет - значит возвращает число, например val("45") будет 45.
*рассмотрены текстовые функции: len, val, str, asc, chr, right, mid, instr, lcase, ucase, ltrim, utrim, trim, space, string.*
[0. FreeBASIC лучший из диалектов бейсика](https://serey.io/ru/@freebs/00-freebasic)
[1. Начинаем изучать FreeBasic ](https://serey.io/ru/@freebs/01-freebasic)
[2. Переменные в Бейсике ](https://serey.io/ru/@freebs/02-freebasic)
[3. Текстовые переменные и операции с ними](https://serey.io/ru/@freebs/03-freebasic)

