5. ПЕРЕМЕННЫЕ И КОНСТАНТЫ

Иногда необходимо запомнить или записать кое-что на память. Мы для этого пользуемся, например, записной книжкой (простой или электронной), записями на бумаге, а иногда - зарубками.

При выполнении вычислений или обработке информации тоже требуется иногда запоминать некоторые промежуточные результаты. Для каждого из этих результатов выделяется участок памяти компьютера, состоящий из одного или нескольких байтов (это фундаментальное понятие вычислительной техники конечно известно читателю). Для того чтобы эти участки памяти можно было различать, а также иметь возможность сослаться на содержимое некоторого конкретного участка памяти (ведь не укажешь же на него пальцем), ему сопоставляют имя. Вот эта пара, включающая участок памяти и сопоставленное ему имя, и есть переменная.

Итак, переменная – это в некотором смысле ячейка для хранения информации, например, числа, строки символов. При этом имеется возможность неоднократно считывать значение переменной, а также возможность записывать в эту ячейку другое значение. Переменная может изменять свое значение в процессе выполнения программы. Ее значение может оставаться неизменным от начала до конца выполнения программы, но принимать разные значения в разных прогонах программы.

Имена переменных в Visual Basic должны удовлетворять следующим требованиям:

·        начинаться с буквы;

·        включать только буквы, цифры, символ подчеркивания (_), который на клавиатуре находится под тире (-);

·        содержать не более 255 символов.

Обратите внимание, имя не может содержать пробел ( ), точку (.), запятую (,), восклицательный знак (!) или символы (@), (&), ($), (#). Не следует использовать имена, совпадающие с ключевыми (зарезервированными) словами языка.

В языке Visual Basic не различаются строчные и прописные буквы.

Множество возможных значений переменной, допустимые операции, которые к ней применимы, количество байтов, отведенных для нее, определяется типом переменной. В каждом языке программирования определена своя система типов переменных.

К константам относится все то, что сказано выше о переменных. Но есть одно существенное отличие: константа не может изменить значение при выполнении программы. Переменные и константы – это данные. Познакомимся с системой типов данных Visual Basic.

5.1. Основные типы данных Visual Basic

Табл. 5.1 Основные типы данных Visual Basic.

Тип данных

Размер ячейки в байтах

Диапазон значений

Boolean (логический)

2

True или False

Byte (байт)

1

От 0 до 255

Integer(целый)

2

От -32 768 до 32 767

Long (длинный целый)

4

От -2 147 483 648 до 2 147 483 647

Single (с плавающей точкой обычной точности)

4

Абсолютное значение находится в диапазоне от 1,401298E-45 до 3,402823E38*

Double (с плавающей точкой двойной точности)

8

Абсолютное значение находится в диапазоне от 4,94065645841247E-324 до 1,79769313486232E308*

Currency (денежный)

8

От -922 337 203 685 477,5808 до

922 337 203 685 477,5807

Date (дата/время)

8

От 1 января 100 г. до 31 декабря 9999 г.

Object (объект)

4

Любой указатель объекта

String (строка переменной длины)

10 байт + длина строки

Длина строки от 0 до приблизительно 2 миллиардов символов

Variant (универсальный тип)

 

16 байт+ длина строки

Дата/время; числовые значения с тем же диапазоном, что и для Double; строки с тем же диапазоном, что и для String

Type (тип, определяемый пользователем)

Определяется компонентами

Диапазон каждого элемента определяется его типом данных

* Под записью (Число1ЕЦелоеЧисло2) следует понимать Число1, умноженное на 10, возведенное в степень ЦелоеЧисло2.

Если, например, в программе имеется переменная типа Integer с именем КоличествоСтудентов, то где-нибудь в программе можно написать:

КоличествоСтудентов = 1000

и для всех инструкций, которые появятся после этого, переменная КоличествоСтудентов будет всегда равна числу 1000 – пока, возможно, не появится инструкция

КоличествоСтудентов = 1050

КоличествоСтудентов в этой инструкции является именем переменной, а 1000 в этом примере – её значением.

Инструкцию КоличествоСтудентов = 1000 называют присвоением: переменная КоличествоСтудентов получает значение, равное 1000.

Эту инструкцию нельзя понимать в том смысле, что левая часть равна правой части. Присвоение – это действие, заключающееся в том, что значение правой части записывается в ячейку памяти, отведенную для хранения значения переменной, имя которой указано слева от знака равенства в инструкции присвоения. Будет ошибкой записать эту инструкцию так: 1000 = КоличествоСтудентов

Слева от знака равенства должна находиться переменная.

          Переменные типов Byte, Integer, Long, Single, Double, Currency принимают числовые значения.

          Если в программе имеется переменная a типа Single, то такой переменной можно присвоить числовое значение с дробной частью, например: a = – 62.697

В этой инструкции присваивания справа от знака равенства находится константа с плавающей точкой. В Visual Basic для отделения целой части от дробной части применяется символ (.). Возможен другой способ записи констант с плавающей точкой – с порядком. Например,
1.5
Е–16 означает 1.5*10-16 (или иначе 0.00000000000000015).

К числовым переменным можно применять арифметические операции сложения (+), вычитания (–), умножения (*), деления (/), возведения в степень (^).

Значением переменной типа String может быть символ или строка символов.

Значением переменной типа Date может быть, дата, время или дата и время.

Переменная типа Boolean может принимать всего два значения. Такая переменная может иметь значение True (истина) или значение False (ложь).

Тип Variant является универсальным. Переменные типа Variant могут принимать числовые значения, значения символов и строк символов, значение даты, времени и даты и времени. Остальные типы данных пока комментировать не будем.

Если UserName является переменной типа String, тогда можно написать: UserName = "Иван" (здесь очень важны кавычки, так как иначе компьютер может принять Иван за имя переменной). Этот пример показывает, что константа типа String должна быть заключена в двойные кавычки.

К строковым переменным и константам можно применять операцию сцепления, которая обозначается символом (&) или символом (+). Например, можно написать:

UserName = UserName & " Иванов"

После выполнения этой инструкции переменная UserName будет иметь значение "Иван Иванов".

Если ДеньРождения и EndOfTime являются именами переменных типа Date, тогда можно записать:

ДеньРождения = #29.10.1970#

EndOfTime = #8:30#

(как символы выделяют кавычками, так дату или время выделяют символом (#)). Дату и время можно поместить в одну переменную. Для переменной DateAndTime типа Date может быть записано:

DateAndTime = #13.2.2000 11:30#

5.2. Структура проекта

Проект обычно включает одну или несколько форм, а также может включать модули. С формой Вы уже имели дело при выполнении предыдущих заданий. Форма при выполнении проекта отображается на экране монитора в виде окна. Она может содержать объекты (надписи, кнопки и т.д.). Модуль отличается от формы тем, что он никак не отображается на экране монитора при выполнении проекта и не может содержать объекты.

Каждая форма и каждый модуль проекта имеют главную секцию (General), в которой может быть записан программный код.

В главной секции могут быть объявлены константы и переменные.

Наряду с главной секцией форма и модуль могут включать секции, каждая из которых является объявлением процедуры или функции.

5.3. Объявление переменных и констант

Если переменная применяется в проекте, она должна быть объявлена. Существуют следующие уровни объявления переменных и констант:

·        Уровень процедуры (функции). Имя, объявленное в процедуре, действует только внутри этой процедуры и не действует вне этой процедуры.

·        Уровень формы. Имя, объявленное в главной секции формы, действует во всех процедурах этой формы, но не действует в других формах и модулях.

·        Уровень проекта. Имя, объявленное в главной секции модуля с предваряющим словом Public (Общий), действует во всех формах и модулях проекта.

Надо иметь в виду, если при объявлении переменной тип явно не указан, то будет назначен тип Variant. Такой способ объявления называется объявлением по умолчанию.

          При объявлении константы необходимо задать ее имя, тип, область действия и значение.

Синтаксис объявления константы:

[Public/Private] Const ИмяКонстанты [As Тип] = Значение

В подобных определениях синтаксиса прямоугольные скобки [ ] означают, что конструкция, находящаяся внутри этих скобок, не обязательна. Символ (/) означает, что должно быть выбрано одно из слов, между которыми он поставлен. Сами же символы ([), (]), (/) в текст объявления не включаются.

Приведенное определение синтаксиса означает, что объявление константы начинается с обязательного слова Const (Константа). Перед Const может стоять одно из слов: Private (Локальный) или Public (Общий), задающих область действия константы. Затем следует имя константы. После имени может стоять слово As и наименование типа. Затем следует знак равенства и значение константы.

В определении подчеркнуто наименование той области действия, которая может быть задана по умолчанию.

В следующем примере в главной секции модуля описывается глобальная константа Age целого типа, и ей присваивается значение 54.

Public Const Age As Integer = 54

Допускается также описание нескольких констант в одной строке. В этом случае, чтобы задать тип данных, надо указать название типа для каждой константы.

В следующем примере описываются локальные константы Ag и Wg как Single.

Const Ag As Single = 3.14, Wg As Single = 2.78

Синтаксис объявления переменной:

Static/Public/Private/Dim ИмяПеременной [As Тип]

Зарезервированное слово Dim (Размерность) при объявлении переменных применяется чаще всего.

Статические переменные, описанные на уровне процедуры со словом Static вместо слова Dim, сохраняют свои значения даже после выхода из процедуры при повторном входе в эту процедуру.

Вот пример объявления переменной типа строки символов:

Dim strName As String

Если не указать тип переменной, ей будет присвоен тип Variant. При этом следует учитывать, что переменные типа Variant занимают больше места в памяти и обращение к ним происходит медленнее.

В одной строке можно объявить несколько переменных, но при этом следует для каждой указывать имя типа:

Dim a As Integer, b As Integer, c As Long

Dim e As Integer, f, g

В первой строке объявлены две переменные типа Integer и одна переменная типа Long. Во второй строке – одна переменная  типа Integer, а две другие – типа Variant по умолчанию.

При объявлении переменная, не получает значения, ей только отводится память, а ее значение не определено.

Можно вообще не объявлять переменные. Однако такая практика является источником ошибок, и ее надо избегать. Чтобы Visual Basic расценивал любую необъявленную переменную формы или модуля как ошибочную, в главной секции формы или модуля первой должна следововать инструкция Option Explicit. Эта инструкция налагает требование явного описания всех переменных этой формы или модуля. Если модуль содержит инструкцию Option Explicit, при попытке использования неописанного или неверно введенного имени переменной возникает ошибка во время исполнения программы.

Можно так настроить среду Visual Basic, что инструкция Option Explicit будет автоматически помещаться системой Visual Basic в главной секции создаваемой формы или модуля. Для этого надо выполнить команды меню Tools (Инструменты), затем Options (Свойства), затем на вкладке Editor (Редактор) установить флажок в окошке Require Variable Declaration (требовать объявления переменных) и, наконец, щелкнуть на кнопке ОК. Но это следует сделать до создания формы или модуля.

5.4. Преобразование и совместимость типов

В этом разделе речь будет идти о тех ситуациях, когда при выполнении операции или инструкции участвуют данные разных типов. Например, что произойдет, если переменной целого типа присваивается числовое значение типа Single.

В отношении типов Visual Basic проявляет максимальную терпимость – когда это возможно, преобразование одного типа в другой будет выполнено автоматически и программисту нет нужды об этом заботиться. При этом соблюдаются перечисленные ниже правила.

¨     При преобразовании числа с плавающей точкой в целое происходит округление до ближайшего целого.

¨     При преобразовании целого числа в число с плавающей точкой дробная часть принимается равной нулю.

¨     В случае преобразования целого типа в другой целый тип возможна ситуация, когда целый тип с большим диапазоном значений преобразуется в целый тип с меньшим диапазоном значений. Если значение, присваиваемое «короткому» типу, выйдет за пределы диапазона его допустимых значений, произойдет ошибка периода выполнения.

¨     Строковые и числовые типы совместимы. Можно присвоить числовое значение строковой переменной и наоборот.

Например, не возникнет ошибки периода выполнения при присвоении свойству Caption, которое имеет тип String, значения 125 переменной типа Integer. Произойдет преобразование целого числового значения 125 в строку символов “125”.

И наоборот. При присвоении переменной целого типа значения свойства Text некоторого текстового окна, которое имеет тип String (пусть, например, в этом текстовом окне набрано три символа 125), произойдет преобразование строки символов “125” в целое число и целочисленная переменная получит значение 125. Однако строка символов должна быть такой, чтобы она могла трактоваться как число.

Возможно также выполнение арифметической операции, например умножения (*), когда один или оба операнды являются строкой символов, но при условии, что их значения, можно интерпретировать как числа. При этом особую осторожность следует соблюдать с операцией (+), которая в зависимости от контекста может означать либо операцию сложения, либо операцию сцепления.

 В операции операнд1 + операнд2 символ (+) Visual Basic будет воспринимать как:

-         операцию сложения, если оба операнда имеют какой-либо из числовых типов;

-         операцию сложения, если один операнд имеет числовой тип, а второй является строкой символов, значение которой может быть интерпретировано как число;

-         операцию сцепления, если один операнд имеет числовой тип, а второй является строкой символов, значение которой не может быть интерпретировано как число;

-         операцию сцепления, если оба операнда имеют строковый тип независимо от их значений.

Теперь можно приступить к разработке проекта.

5.5. Разработка проекта

1.     Создайте в корневом каталоге диска d свою рабочую папку.

2.     Запустите Visual Basic. Ознакомьтесь с окном проекта.

Если появилось окно New Project, то выберите
Standart EXE (стандартный)  вкладки New (новый) и щелкните на кнопке Открыть.

3.     Поместите на открывшейся форме шесть текстовых окон, три надписи и три кнопки. Ваша форма должна выглядеть так, как на рис. 5.1.

4.     Щелкните дважды на форме Form1. В открывшемся окне кода Project1 – Form1 (Code) раскройте список объектов и выберите главную секцию (General).

5.     Введите в главной секции код, указанный далее.

Option Explicit

'Требование явного объявления переменных

'в пределах формы Form1

Dim i As Integer

'Объявлена переменная i целого типа

Dim r As Single

'Объявлена переменная r с плавающей точкой

'обычной точности

Dim st1 As String, st2 As String

'Объявлены переменные st1 и st2 строкового типа

На примере этого фрагмента программного кода можно увидеть, как документируется программа с помощью комментариев. Все, что находится в строке правее символа (‘) рассматривается как комментарий, присутствующий в программном коде, но не оказывающий влияния на результаты его выполнения.

6.     Сохраните проект в своей рабочей папке.

7.      Раскройте список объектов и выберите объект Command1. В окне кода появилась заготовка процедуры Command1_Click.

8.     Задайте программный код:

Private Sub Command1_Click()

  i = Text1.Text

  r = Text2.Text

  Label1.Caption = r + i

End Sub

9.     Щелкните на кнопке Start для запуска проекта. В появившемся окне приложения Form1 наберите в поле Text1 значение 2 (предварительно удалив строку Text1), наберите в поле Text2 значение 1,3 (предварительно удалив строку Text2). После этого щелкните на кнопке Command1.  Последнее событие приведет к выполнению инструкций процедуры Command1_Click и надпись отобразит результат 2+(1.3). На рис. 5.2 показан вид окна приложения Form1 после указанных действий.

Обратите внимание, при вводе строки в окне Text2, которая интерпретируется программой как число с плавающей точкой, для разделения целой и дробной частей применена не точка, а запятая. Это связано с тем, что настройкой операционной системы в качестве разделителя целой и дробной части чаще всего установлена именно запятая. Вид разделителя можно изменить. Для этого необходимо выполнить команды Настройка и Панель управления меню кнопки Пуск панели задач. Затем следует выбрать Язык и стандарты и на вкладке Числа  в окне Разделитель дробной и целой частей числа установить нужный разделитель и щелкнуть на кнопке ОК. Для защиты от недостаточно квалифицированных пользователей команда Настройка в учебных компьютерных классах может быть исключена из меню кнопки Пуск. Поэтому изменить разделитель целой и дробной частей числа может оказаться проблематично.

Итак, будем исходить из того, что при записи констант в программном коде следует применять точку для разделения целой и дробной частей, а во входном потоке при вводе значений переменных надо применять запятую.

Остановимся подробнее на существенных, но на первый взгляд не заметных, особенностях выполнения инструкций процедуры Command1_Click. При выполнении этих трех инструкций четыре раза осуществляется преобразование типа.

Так при выполнении инструкции присвоения i = Text1.Text тип String значения свойства Text текстового окна Text1 преобразуется в тип Integer переменной i.

При выполнении инструкции присвоения r = Text2.Text тип String значения свойства Text текстового окна Text2 преобразуется в тип Single переменной r.

В инструкции Label1.Caption = r + i при выполнении арифметической операции сложения тип Integer операнда i преобразуется к типу Single операнда r, так как арифметическая операция может быть выполнена над однотипными операндами, а тип с плавающей точкой старше целого типа.

Наконец, результат сложения типа Single преобразуется к типу String значения свойства Caption надписи Label1.

10.            Остановите выполнение проекта, щелкнув на кнопке End панели инструментов, и сохраните проект.

11.            Щелкните два раза на кнопке Command2. В окне кода появилась заготовка процедуры Command2_Click.

12.            Задайте программный код:

Private Sub Command2_Click()

  st1 = Text3.Text

  st2 = Text4.Text

  Label2.Caption = st1 + st2

End Sub

13.            Щелкните на кнопке Start для запуска проекта и в появившемся окне приложения Form1 наберите в текстовом окне Text3 строку Вас (предварительно удалив строку Text3), а также наберите в текстовом окне Text4 строку илий (предварительно удалив строку Text4). После этого щелкните на кнопке Command2. Последнее событие приведет к выполнению инструкций процедуры Command1_Click и надпись отобразит результат Василий операции сцепления, как это показано на рис. 5.3.

Полученный результат Вас не должен удивлять. В инструкции Label2.Caption = st1 + st2 символ операции (+) воспринимается как символ операции сцепления, а не операции сложения, поскольку оба операнда st1 и st2 имеют строковый тип. А что произойдет, если в текстовых окнах задать числа?

14.            Удалите в текстовом окне Text3 строку Вас и наберите 25, а также удалите в текстовом окне Text4 строку илий и наберите 15. После этого щелкните на кнопке Command2. На рис. 5.4 показан результат.

Опять произошло сцепление операндов. Это следовало ожидать, поскольку оба операнда (свойства Text) имеют строковый тип. Посмотрите, что произойдет, если один операнд будет иметь строковый, а другой – числовой, например, целый тип.

15.            Остановите выполнение проекта, щелкнув на кнопке End панели инструментов, и сохраните проект.

16.            Щелкните два раза на кнопке Command3. В окне кода появилась заготовка процедуры Command3_Click.

17.            Задайте программный код:

Private Sub Command3_Click()

  st1 = Text5.Text

  st2 = Text6.Text

  Label3.Caption = 25 + st1 + st2

End Sub

18.            Щелкните на кнопке Start для запуска проекта и в появившемся окне приложения Form1 наберите 2 в текстовом окне Text5 (предварительно удалив строку Text5), а также наберите 3 в текстовом окне Text6 (предварительно удалив строку Text6). После этого щелкните на кнопке Command3. Последнее событие приведет к выполнению инструкций процедуры Command3_Click и надпись отобразит результат операции, что и показано на рис. 5.5.

При выполнении вычисления значения выражения 25 + st1 + st2 первой выполняется операция 25 + st1. В этой операции  один операнд (константа 25) имеет числовой тип, а другой (строка st1) имеет значение, которое может быть интерпретировано как число. Поэтому здесь символ (+) воспринят как операция сложения. Результат операции сложения (27) тоже имеет числовой тип, поэтому символ (+) в следующей операции 27+3 также воспринят как операция сложения и, в конце концов, получен понятный результат 30.

19.            Остановите выполнение проекта, щелкнув на кнопке End панели инструментов, и сохраните проект.

20.            Щелкните два раза на кнопке Command3. В окне кода появился программный код процедуры Command3_Click.

Измените порядок следования операндов в инструкции присвоения Label3.Caption = 25 + st1 + st2. Замените ее инструкцией Label3.Caption = st1 + st2 + 25.

21.            Щелкните на кнопке Start для запуска проекта и в появившемся окне приложения Form1 снова наберите 2 в текстовом окне Text5 (предварительно удалив строку Text5), а также наберите 3 в текстовом окне Text6 (предварительно удалив строку Text6). После этого щелкните на кнопке Command3. Надпись отобразит на первый взгляд неожиданный результат вычислений (см. рис. 5.6).

Изменение порядка слагаемых привело к изменению значения результатов вычислений! Почему? Дело в том, что первой теперь выполняется операция st1 + st2, в которой символ (+) воспринимается как операция сцепления, поскольку оба операнда имеют строковый тип.

 Результат операции соответственно тоже имеет строковый тип и равен “23”.

При выполнении операции “23” + 25 символ (+) будет воспринят, как операция сложения, поскольку один операнд (константа 25) имеет числовой тип, а другой операнд (“23”) может быть интерпретирован как число.

22.            Остановите выполнение проекта, щелкнув на кнопке End панели инструментов, и сохраните проект.

23.            Покажите результат выполнения задания преподавателю.

24.            Удалите свою рабочую папку.

Подведем итоги.

          В Visual Basic предусмотрено несколько типов для переменных, принимающих числовые значения. Какой тип применять в каждом конкретном случае? Для ответа на этот вопрос надо учитывать следующее.

1.        Тип Variant является универсальным. Его применение делает программный код более компактным, так как этот тип можно не объявлять – он предусматривается по умолчанию. Однако каждое данное этого типа занимает в памяти больше места. А обращение к данным типа Variant происходит медленнее, чем к данным простых типов.

2.        Арифметические операции с данными целого типа (Integer, Long) выполняются быстрее, чем с данными с плавающей точкой (Single, Double).

3.        Арифметические операции с данными целого типа (Integer, Long) выполняются точно, а с данными с плавающей точкой (Single, Double) - приближенно.

В соответствии с этими соображениями не рекомендуется применять тип Variant в тех случаях, когда проект должен выполняться быстро, а также должен занимать мало места в памяти.

Целый тип рекомендуется применять, если данное может принимать только целые значения (например, количество участников или номер элемента некоторой последовательности).

Необходимо по возможности избегать преобразования типа. Неправильная трактовка этого действия приводит к трудно диагностируемым ошибкам.

5.6. Вопросы для контроля

1.     Что общего и чем различаются переменные и константы?

2.     Что определяет тип данного?

3.     Когда возникает необходимость преобразования типа данного?

4.     Поясните синтаксис объявления константы.

5.     Поясните синтаксис объявления переменной.

6.     Как определяется область действия данного?

7.     Какова структура проекта?

8.     Каковы результаты операций 2+3, 2+”3”, “2” + “3”?

9.     Как зависит от типа числовой переменной точность и скорость выполнения арифметической операции?

Hosted by uCoz