02 [FreeBASIC] Переменные в Бейсике
Очень часто результат необходимо сохранять в памяти компьютера, а со временем и изменять его, а на экран не всегда и не всё нужно выводить. В языках программирования для сохранения значений служат *переменные*.
http://ipic.su/img/img7/fs/05.1527546627.jpg
Переменная это область памяти, где хранится значение, обозначаемая определённым именем. *Имя переменной* состоит из букв латинского алфавита и цифр. В конце имени переменной иногда добавляют некоторые специальные символы для указания типа значения которое хранится в переменной.
Раньше было ограничение на длины имён переменных, сейчас такого практически нет. В некоторых языках имя переменной записанное символами в другом регистре может означать совсем другую переменную. Бейсик и Паскаль не чувствителен к регистру, т.е. смена регистра написания переменной означает одну и ту же переменную. А вот в языке С/С++ это будут разные переменные, причём в этом языке символ подчёркивания `_` "считается" буквой и может быть даже первым символом в имени переменной.
Посмотрим действительно ли регистр написания имени переменной не имеет значения в FreeBASIC. *(Первая строчка говорит компилятору FreeBASIC рассматривать текст нашей программы в режиме совместимости со старым очень популярным в своё время вариантом бейсика QuickBasic)*
`#lang "qb"`
`Aa=10`
`aA=12`
`print Aa, aA`
http://ipic.su/img/img7/fs/01.1527525443.jpg
Как видим эти имена обозначают одну и ту же переменную.
Сначала в переменную `Aa` заносится значение 10, потом это значение заменяется значением 12, т.к. записи `Aa` и `aA` обозначают одну и ту же переменную. И в результате мы видим дважды число 12. Если бы это были разные переменные, то значение 10 не затёрлось бы и при выводе мы бы увидели значение и 10 и 12.
## Тип переменной
Рассмотрим суффиксы добавляемые к именам переменных для обозначения их типа.
В переменной могут храниться целые числа и вещественные числа. И для целых и для вещественных существует по два типа, т.е всего четыре типа переменных. В переменных можно ещё хранить текст - тогда это текстовая переменная. Итого пять типов. Другие названия для этого типа строковая переменная, или символьная переменная. *текстовая, строковая и символьная всё-таки немножко не одно и то же , но не будем сейчас на это обращать внимание*
| суффикс |тип переменной |
| :--------: |---|
| % | тип Integer (целый) |
| & | тип Long (длинное целое) |
| ! | тип Single (вещественный одинарной точности) |
| # | тип Double (вещественный двойной точности) |
| $ | тип String (строковый) |
*В советской литературе символ строковых переменных - `¤` вместо доллара, если встретите.*
`#lang "qb"`
`a%=8/7`
`a&=8/7`
`a!=8/7`
`a#=8/7`
`print a%`
`print a&`
`print a!`
`print a#`
`print a`
Как видим из примера **a%**, **a&**, **a!**, **a#** - это разные переменные, а использование имени переменной без суффикса означает что будет использован вещественный тип одинарной точности, тип по умолчанию. Логика конечно здесь немножко хромает)), а может **a!** и **a** это разные переменные? Можете убедиться что всё-таки это одна и та же переменная добавив в текст программы строку `a=11/7`. После пятой строки, между блоком вычислений и печатью результатов.
В ранних версиях Бейсика оператор присваивания записывался так `let a=10`. Теперь оно "лишнее", но в некоторых диалектах, например Sianclair BASIC оно было обязательно.
А как вы оцените такую запись `a=a+1`? Ничего не смущает? Как может быть число рано числу на единицу большему самого себя?))) Это не знак равенства - это оператор **присваивания значения**. Компьютер, или компилятор FreeBASIC рассматривает вначале правую часть `a=a+1`, он берет из памяти обозначенной именем `a` значение, прибавляет к нему единицу, а потом этот результат помещает назад в память где хранилось прежнее значение переменной `a`. Получается что старое значение затирается(заменяется) новым.
## Текстовые переменные
`a$="это текстовая строка"`
`tr12$="$%^&&*($FdFr$%FGzXF-678T%"`
вот пример текстовых(строковых, символьных) строк. Как для числовых переменных так и для текстовых есть операции и функции проводимые над ними. Об этом в следующем уроке.
## DIM
Использование суффиксов для имён переменных это уже прошлое, но в книгах довольно часто встречается, а их было написано много за время жизни Бейсика.
Согласно ~~новым веяниям и правилам этикета~~ стандартам переменные(их тип) должны быть объявлены и определены в начале программы.
**Dim** *имя_переменной1* **As** *тип_переменной1*, *имя_переменной2* **As** *тип_переменной2*, ...
или
**Dim As** *тип_переменной, имя_переменной1, имя_переменной2, имя_переменной3 ...*
именно это "требование" и отключает директива `#lang "qb"`. Т.е. она позволяет не объявлять переменные заранее.
Если необходимо переменным можно сразу же давать начальные значения:
**Dim** *имя_переменной1* **As** *тип_переменной1=выражение*, *имя_переменной2* **As** *тип_переменной2=выражение*, ...
тип переменной один из встроенных FreeBASIC типов данных: **byte, ubyte, short, ushort, integer, uinteger, long, ulong, longint, ulongint, single, double**
|Тип|Размер(в битах)|Формат|Мин. значение|Макс Значение|
|:--:|:--:|:--|:--:|:--:|
|byte|8|целое число со знаком| -128| +127|
|ubyte|8|целое число без знака| 0| +255|
|short|16|целое число со знаком| -32768| +32767|
|ushort|16|целое число без знака| 0| 65535
|integer|32|целое число со знаком| -2147483648| +2147483647|
|uinteger|32|целое число без знака| 0| 4294967395|
|long|32*|целое число со знаком| -2147483648| +2147483647|
|ulong|32*|целое число без знака| 0| 4294967395|
|longint|64|целое число со знаком| -9223372036854775808| 9223372036854775808|
|ulongint|64|целое число без знака| 0| +18446744073709551615|
|single|32|с плавающей точкой| +/-2.802597 E-45| +/-3.402823 E+38|
|double|64|с плавающей точкой| +/-4.490656458412465 E-324| +-1.797693134862310 E+308|
### Зачем же нужны столько разных типов?
А FreeBASIC же имеет ещё больше типов переменных, чтобы идти в ногу с совремёнными языками. Было бы два: текстовый и числовой
Первые компьютеры были очень ограничены в ресурсах - нужно было экономить на всём и на объёме памяти и на быстродействии. Вещественные переменные занимают в памяти больше места чем целые, переменные двойной точности занимают больше чем одинарной, а длинные целые - больше чем просто целые. И учитывая что переменных в программе может быть **очень** много это и сейчас большой плюс в экономии, а раньше - тем более. Ещё один аргумент - быстродействие. Операции над целыми числами компьютер производит намного быстрее, чем над вещественными. Да и вы думаю тоже. Разделите 400 на два, и на три, а на полтора?
[0. FreeBASIC лучший из диалектов бейсика](https://serey.io/ru/@freebs/00-freebasic)
[1. Начинаем изучать FreeBasic ](https://serey.io/ru/@freebs/01-freebasic)

