При объявлении нужно указывать тип

Попытаемся вернуть нашей программе способность вычислять периметр:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim a, b, S, p

a = InputBox("Введите длину прямоугольника")

b = InputBox("Введите ширину прямоугольника")

S = a * b 'Площадь

p = a + a + b + b 'Периметр

Debug.WriteLine(S)

Debug.WriteLine(p)

End Sub

Запустите проект. Введите длину 3 и ширину 2. Вы получите неожиданный результат:

Площадь равна 6. Правильно. А вот периметр должен бы равняться 10, а не 3322. Откуда взялись эти 3322? Да ведь это не что иное, как две тройки и две двойки! И получились они из a+a+b+b.

Здесь тот же случай, что и с калькулятором (см. 3.3). Там было то же самое, пока мы не применили Val. Почему так получается?

Первое: VB считает содержимое текстового поля в окне InputBox (точно так же, как и обычного текстового поля) текстом, а не числом, если даже оно состоит из цифр. А раз так, то и значения переменных a и b, взятые из текстового поля, он тоже считает текстом, а не числами. Не пей из копытца – козленочком станешь!

Второе: VB знает, что по правилам языка знак +имеет несколько смыслов в зависимости от того, к чему он применяется. В частности, при работе с числами это приказ складывать, а вот при работе с текстом это не приказ складывать, а приказ выстраивать в цепочку. А раз так, то и результат получился тот, что мы видели.

Почему же тогда площадь вычислилась нормально? Потому что там было не сложение, а умножение. VB знает, что по правилам языка знак умножения * не имеет смысла при работе с текстом. Значит (догадывается умный и услужливый VB) мой господин-человек не хочет, чтобы переменные a и b имели текстовое значение, иначе он не стал бы применять знак умножения, ведь мой хозяин умный. Значит иметь им числовое значение! Проверьте: подсуньте компьютеру вместо чисел буквы – VB запротестует при вычислении площади.

При вычислении площади VB догадался правильно, а при вычислении периметра ума не хватило. Ну что? – теперь везде при сложении применять Val? Не хочется, программы будут получаться громоздкими. Да и разве все дело только в сложении? Как узнаешь, где в следующий раз соломки подстелить?

Так вот: чтобы не перенапрягать умственные способности VB и предохранить себя от неприятностей, нужно при объявлении переменных величин указывать их так называемый тип(на балу – титул!).

Что это такое? Сделаем небольшое добавление к оператору Dim. В остальном оставим процедуру неизменной. Вот что у нас получится (добавление я выделил полужирным шрифтом):

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim a, b, S, p As Integer

a = InputBox("Введите длину прямоугольника")

b = InputBox("Введите ширину прямоугольника")

S = a * b 'Площадь

p = a + a + b + b 'Периметр

Debug.WriteLine(S)

Debug.WriteLine(p)

End Sub

Оператор объявления

Dim a, b, S, p As Integer

переводится так:

Объявляю переменные величины a, b, S, p как целые числа

то есть вы обязуете VB обращаться с переменными величинами a, b, S, p, как с целыми числами и ничем иным. Говорят, что переменные a, b, S, p имеют тип Integer.

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

Запустите проект. Проверьте его работу. Теперь все работает нормально.

Типы переменных в VB

Типы Integer и Double. Много ли прав на нашем балу у барона Integer? Посмотрим. Попробуем ввести дробное значение длины прямоугольника – две целых одну десятую – 2,1. Именно так – с запятой, а не точкой. (Я полагаю, что ваш Windows настроен на Россию, где в дробных числах пишут запятую. В противном случае вам нужно писать точку, как это делают на Западе, причем не только в тексте программы, но и в текстовых полях). Посмотрим результат. VB при вычислениях считает a целым числом 2. А теперь – 2,8. VB считает a целым числом 3. Все правильно. Наш барон, как ему и положено, высокомерно отказывается быть дробным числом и поэтому любое число, которое мы ему предлагаем, округляет до целого. Так устроен тип Integer.

Предположим, мы этим недовольны. Мы желаем, чтобы все числа могли быть и дробными тоже. Пожалуйста! Для этого достаточно всех гостей объявить князьями. Изменив оператор Dim вот так:

Dim a, b, S, p As Double

Оператор объявления

Dim a, b, S, p As Double

переводится так:

Объявляю a, b, S, p как десятичные дроби двойной точности

то есть вы обязуете VB обращаться с переменными величинами a, b, S, p, как с десятичными дробями и ничем иным. Десятичная дробь – это не только число, меньшее единицы. Нет – это вообще любое число, которое может иметь целую и дробную часть (например, 27,3908). В частности это и любое целое число. О смысле двойной точности попозже.

Законный вопрос: зачем нам нужен тип Integer, когда тип Double очевидно «гораздо богаче и лучше»? Ответ: Не во всем и не всегда он лучше, иначе не стали бы его создавать вообще. Подробнее об этом – в 5.4.5.

Список типов VB. На бал к VB вхожи не только бароны и князья, то есть типов переменных в VB довольно много и каждый полезен по-своему. Рассматривать новые типы я буду по мере надобности. Вот какие типы данных вы найдете в этой книжке:

Тип Описание Ссылка
Byte Целое число – очень короткое, положительное (от 0 до 255) 5.4.3
Short Целое число – короткое (от -32768 до 32767) 5.4.3
Integer Целое число – обычное (от -2147483648 до 2147483647) 5.4.3
Long Целое число – длинное (от -9223372036854775808 до 9223372036854775807) 5.4.3
Single Десятичная дробь обычной точности 5.4.4
Double Десятичная дробь двойной точности 5.4.4
Decimal Десятичная дробь длинная, абсолютной точности 5.4.5
Char Символ (любой из 65536 знаков, букв, цифр и других символов) 19.1.2
String Строка (произвольный текст) 19.1
Boolean Логический тип (истина – ложь) 7.5.4
Date Дата и время 13.1
  Массивы Глава 15.
Enumerations Перечисления. Типов перечислений много и все с разными именами. 13.3
Structures Структуры – пользовательские типы. Типов структур много и все с разными именами. 16.3
Классы Типов классов огромное количество и все с разными именами. 21.4
Object Объект – всеобъемлющий тип-хамелеон 11.5.1

Для каждого из упомянутых в таблице типов вы можете объявлять переменные при помощи оператора Dim.

Наши рекомендации