При объявлении нужно указывать тип
Попытаемся вернуть нашей программе способность вычислять периметр:
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.