В эпоху появления программирования, программы написанные на том или ином языке становились все сложнее и сложнее. И допустим, у нас есть программа, где используется значение 3.5 в сотни разных мест программы, а потом настает момент, когда мы в этой же программе должны заменить число 3.5 на 2.7. Получается, что надо вручную в каждом месте программы где использовалось значение 3.5 заменить 2.7. Работа будет большая и нудная.
И тогда программистам пришла в голову идея – а что если бы компьютер хранил значение 3.5 под именем, допустим, “Необходимое значение для вычислений” внутри своей памяти, а в программе мы бы использовали только его имя. И когда бы наступил момент, что надо заменить 3.5 на 2.7, мы бы просто поменяли один раз значение в имени где то в памяти компьютера, а программа осталась бы неизменной. Звучит круто!
И тогда появилась у компьютеров оперативная память: память, которая хранит определенные данные и стирает их после выключения компьютера (в отличие от SSD или HDD, которые сохраняют данные даже после выключения. Но оперативная память гораздо быстрее их работает с данными и она предназначена для таких данных, которые не надо хранить после выключение компьютера). Здесь можно провести аналогию с памятью человека, где краткосрочная память человека – это оперативная память, долгосрочная память человека – это HDD и SSD.
Современная оперативная память в компьютере выглядит так:
Как вы видите на рисунке, здесь у оперативной памяти есть, скажу так, 8 черных квадратиков. Внутри каждой из них содержится очень большое количество ячеек памяти, которые в свою очередь хранят данные. У каждой ячейки есть свой номер.
Здесь можно провести аналогию с банковскими ячейками, где у каждой банковской ячейки также есть свой номер, и она хранит какие-то предметы.
Итак, программисты создали устройство, которое будет хранить указанные нами данные. А как их указать на языке Pascal?
Все очень просто, для этого нам потребуется второй раздел программы. Помните, что программа Pascal состоит из трех разделов, и мы с вами изучили два из них: первый раздел с именем программы и третий раздел операторов. Настал момент начать изучать второй раздел, который называется “Раздел описания”.
Данный раздел состоит из подразделов, и сейчас мы изучим только один из них – это раздел описания переменных.
Переменная – это как раз та ячейка в оперативной памяти, которую мы арендуем, чтобы хранить там какие-то данные. А называется она переменной потому, что данные в этой ячейке мы можем менять. Переменная – это конструкции языка Pascal и сейчас мы научимся эту конструкцию.
Допустим нам нужна ячейка памяти, т.е. переменная в программе, которая будет хранить количество дней в этом месяце. Я пишу данную лекцию в январе, а в январе 31 день. Т.е. нам нужна переменная, которая хранит цифру 31.
Давайте создадим программу с именем variables.
Теперь напишем второй раздел, а точнее его подраздел – описание переменных.
Чтобы указать компилятору, что мы хотим описать переменные, мы должны начать этот подраздел с зарезервированного слова var (от слова variable – переменная).
Используя слово var мы говорим компилятору, что собираемся использовать ячейку памяти. Но какую именно? Их же много. Как я говорил, у каждой ячейки есть свой номер в двоичном коде, и согласитесь, что самим определять какие ячейки свободные и можно занять набрав их номер в двоичном коде – дело муторное и требует специальных знаний и программ. Легче было бы, чтобы мы определили имя ячейки понятным нам словом или словами и компилятор сам нашел свободную ячейку и поместил туда данные, а мы уже будем обращаться к этой ячейке по имени, которое сами определили. И именно так и делается в языке Pascal!
После слова var мы должны ввести идентификатор, который будет обозначать имя ячейки, например, days т.е. дни.
А далее мы должны указать, что за тип данных мы собираемся хранить в этой ячейке.
И здесь мы с вами затронули тему, которые чуть касались на прошлом уроке – это типы данных. Тогда я просто сказал, что данные делятся на текст и числа. Это был упрощенный взгляд на типы, а на самом деле они подразделяются на простые типы и составные (или структурные). Сейчас мы изучим простые типы, а это:
- целые числа;
- вещественные числа;
- символы;
- логический тип.
Про логический тип мы с вами поговорим позже, а три остальных изучим сейчас. Итак, целые числа. Как вы можете догадаться, целое число – это число без плавающей точки, или это не дробное число, т.е. 1, 2, 5, 8, 135, 543 – это целые числа. Но целые числа в языке Pascal тоже подразделяются на byte, integer, shortint, longint и word. А зачем так много? Нельзя было бы обойтись только одним integer (в переводе “целое число”)?
Дело в том, что компилятор может занять под ваши данные не одну ячейку память и два, три, десять и т.д. И когда мы указываем точно какой тип хотим, мы этим самым указываем компилятору сколько ячеек памяти арендовать под эту переменную.
А когда компьютеры только появились, количество оперативной памяти было очень маленьким, и надо было очень экономно к ней относится. И все эти типы как byte, integer, shortint, longint и word говорят компилятору, сколько ячеек занять под данную переменную, которая будет хранить целое число. А раз под каждый из этих типов выделяется определенное количество ячеек памяти, то и они могут хранить только определенное количество целый значений. Например:
Название целого типа : Диапазон возможных значений
byte: 0 – 255
shortint: -128 – 127
integer: -2 147 483 648 – 2 147 483 647
word: 0 – 65 535
longint: -2 147 483 648 – 2 147 483 647
Вы может спросить, а почему у integer и longint одинаковые значения? Так решили разработчики программы PascalABC.NET. Дело в том что в других компиляторах для языка Pascal могут быть другие диапазоны значений, но рекомендовано, конечно же, чтобы эти диапазоны в разных компиляторах были одинаковые, что на самом деле не так.
Сейчас проблема нехватки оперативной памяти так остро не стоит, как в ранние времена, и диапазон значений integer в 99% случаев всех устраивает, поэтому в основном сейчас программисты используют только его.
Укажем что наша переменная будет хранить целое число. Для этого надо после имени переменной поставить разделитель “:” (который отделяет имя переменной и ее тип) и написать идентификатор типа, а после указание типа ставите точку с запятой, который тоже является разделителем.
Название типа (например, integer) тоже относится к идентификаторам языка Pascal, а значит, в отличие от зарезервированных слов, их значения (или их внутреннюю конструкцию) можно изменять, но это не рекомендуется делать. Например, разработчики PascalABC сделали диапазон значений integer и longint одинаковыми, хотя в других компиляторах они имеют разные диапазоны. Так же мы можем создавать свои типы, но об этом мы поговорим чуть позже на последующих уроках.
И вот, в разделе описания, а точнее в его подразделе описания переменных, мы создали одну целочисленную переменную. Теперь давайте добавим в него какое либо значение. Делается это в разделе операторов с помощью оператора присваивания “:=” (подробнее об операторах мы тоже поговорим позже).
Далее выведем значение переменной days в окне вывода с помощью оператора Write().
Получается оператор Write() выводит только типы данных, как текст, число и т.д. Т.е. когда мы написали между скобками переменную days, оператор Write не может в окне вывода показать название переменной, ему нужно вывести любой тип данных, а не идентификатор переменной, поэтому он смотрит что за значение содержится внутри этой переменной и выводит его.
В итоге, между скобками оператора Write() мы можем писать непосредственно типы данных, знаки операций и переменные.
А что если мы не поместим внутри переменной days какое либо значение и попробуем его вывести.
В итоге мы увидим 0:
Дело в том, если мы не присваиваем значение переменной, то компилятор присваивает ей значение по умолчанию, и это для целый чисел является 0.
А что если мы хотим объявить несколько переменных типа integer, например, a, b, c? Для этого нам надо воспользоваться разделителем “,” и перечислить имена переменных, которые мы хотим создать.
Давайте теперь присвоим переменной “a” значение 10, переменной “b” значение 3.
А в значении “с” мы хотим указать результат вычитания между “a” и “b”.
Т.е. получается, что переменная присваивает только определенный тип данных, но в значении этой переменной мы можем писать не только непосредственно типы данных, но и знаки операций, и имена переменных (все также, как и в операторе Write()). Главное, чтобы в результате получался тот тип данных, который нужен данной переменной.
Выведем значение переменной “с” в окне вывода.
А что если вместо вычитания, мы используем знак деления. Как мы знаем, при делении 10 на 3 у нас получится дробное число 3.333333333… и до бесконечности.
Попробуем выполнить такую программу:
Как видите у нас вышла ошибка, которая говорит, что нельзя присвоить дробное число переменной, которая должна содержать целое число. А как избежать данной ошибки?
Можно воспользоваться знаком div, который делит одно число на другое и выводит целое число без его дробной части.
А раз уже у нас пошла речь о дробных числах (или вещественных), то давайте рассмотрим следующий тип данных – вещественные числа. В программе PascalABC.Net их всего четыре: single, real и double. Так же как и целочисленные, данные типы отличаются диапазоном значений:
Как видите, типы real и double имеют одинаковые диапазоны в PascalABC.Net, и это решение разработчиков данной программы, в других компиляторах у них значения отличаются. Как и с целочисленными значениями, здесь у нас также есть тип, который используются в 99% случаев – это double (или real, так как у них одинаковые диапазоны значений).
Как вы видите, в третьем столбике я указал максимальное количество цифр, которое может содержать тот или иной тип. Например, если разделить 10 на 3, то у нас на самом деле выйдет бесконечное значение, но а что если это бесконечное значение присвоить типу single. Давайте попробуем.
Чтобы объявить, что переменная “с” является типом single, можно написать так:
Но есть способ более красивый и лаконичный:
Такой код более красивый и его легче читать.
Теперь присвоим этой переменной результат деления 10 на 3.
Как видите, вывод состоит из 7 цифр. Если мы поменяем тип “с” на real, то количество цифр в выводе увеличится до 15:
Помимо цифр, переменная может содержать символ: ‘a’, ‘B’, ‘+’ и т.д. Это так называемый символьный тип char. Значение записывается в одинарных кавычках, и в значении переменной символьного типа не может быть больше одного символа.
А что если мы захотим присвоить переменной типа char значение “Hello”?
То у нас выйдет ошибка, так как слово “Hello” относится к типу string (строка). Тип данных строка не относится к простым типам, как целочисленный тип, вещественный, символьный и т.д. Данный тип относится к структурным, но я сейчас его упомянул потому мы уже им пользовались (написав первую программу с выводом “Привет, мир!”.
Остальные структурные типы, и почему они называются структурными, мы разберем на одном из следующих уроков.
Давайте поменяем тип данных для переменной “d” с char на string.
Итак, мы изучили простые типы данных (кроме логического типа, о нем мы поговорим позже), и даже освоили один структурный тип! На следующем уроке мы с вами снова отправимся в изучение истории программирования, начнем изучать парадигмы программирования и новые элементы языка Pascal.