03 [FreeBASIC] Текстовые переменные и операции с ними

F
freebs
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)

Comments