02 [FreeBASIC] Переменные в Бейсике

F
freebs
Очень часто результат необходимо сохранять в памяти компьютера, а со временем и изменять его, а на экран не всегда и не всё нужно выводить. В языках программирования для сохранения значений служат *переменные*. 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)

Comments