В мир информатики # 78 (1—15 октября).
Школа программирования

Основы программирования на Visual Basic

Продолжение. Начало см. “В мир информатики” № 69–73 (“Информатика” 4–8/2006)

Н.М. Тимофеева, г. Обнинск Калужской обл.

Пример программирования № 5
“Вычисление объема”

Постановка задачи

Разработайте программу для вычисления объема конуса по известным значениям длин его высоты и радиуса основания.

План решения

На рис. 1 показан предлагаемый дизайн экрана:

Рис. 1

Назначение каждого элемента управления:

1) блок картинки — для изображения конуса;

2) текстовые окна — для ввода значений исходных параметров;

3) надписи — одна для показа вычисленного объема, остальные — для описания исходных параметров;

4) кнопка — для завершения программы по щелчку на ней.

Каждое из двух текстовых окон будет иметь одинаковые подпрограммы, реагирующие на событие “Нажатие клавиши ”. N – S-диаграмма для разработки подпрограмм [1]:

Обращаем внимание на то, что в отличие от предыдущего проекта, где для каждого окна была написана отдельная процедура обработки события “Нажатие клавиши ”, здесь мы разработаем общую для всех окон подпрограмму.

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

Создание интерфейса

Перед началом работы в Visual Basic вам нужно нарисовать конус, для чего воспользуйтесь программой Windows Paint или другим графическим редактором. Изобразите на рисунке также размеры конуса (см. рис. 1). Сохраните созданный рисунок.

Запустите Visual Basic, начните новый проект, разместите на форму четыре надписи, два текстовых окна, кнопку и блок картинки (PictureBox) — см. рис. 2.

Рис. 2

Установка свойства

Установите следующие свойства в форму элементов управления:

Используя свойство Picture (Картинка) элемента управления PictureBox (Блок картинки), укажите путь к файлу, содержащему изображение конуса, которое вы предварительно нарисовали, чтобы вставить это изображение.

Если вы хотите, чтобы ваша форма была какого-либо другого цвета, установите свойство формы BackColor по вашему выбору (двойным щелчком по выбранному цвету на палитре или на одном из системных цветов). При этом вам нужно будет установить значение свойства BackStyle для всех трех надписей в 0 — Transparent (Прозрачный).

Рис. 3

Написание кода

Как и в предыдущем проекте, код, реагирующий на событие KeyPress (Нажатие на клавишу), будет одинаковым для обоих текстовых окон. Когда нажата клавиша в любом из текстовых окон, процедура обработки события должна обеспечивать вычисление объема и присваивание вычисленного значения свойству Caption надписи lblОбъем. В таких случаях удобно создать общую процедуру, которой могут совместно пользоваться обе событийные процедуры. Выберите пункт Add Procedure (Добавить процедуру) из меню Tools:

Рис. 4

Введите в поле Name имя процедуры ВычислениеОбъема и нажмите клавишу “ОК”. Потом введите код общей процедуры:

Private Sub ВычислениеОбъема()

Const Pi = 3.14 'Объявляем константу

'Вычисляем значение объема

V = 1 / 3 * Pi * Val(txtРадиус.Text) ^ 2 *

Val(txtВысота.Text)

'И выводим его в надписи lblОбъем

lblОбъем.Caption = Format(V, "#,##0.0")

End Sub

Теперь коды событийных процедур для текстовых окон становятся намного проще:

Private Sub txtВысота_KeyPress(KeyAscii As Integer)

'Если нажата клавиша <Enter>,

If KeyAscii = 13 Then

'Отменяем возвращаемый символ

KeyAscii = 0

'Вызываем общую процедуру ВычислениеОбъема

ВычислениеОбъема

End If

End Sub

Private Sub txtРадиус_KeyPress(KeyAscii As Integer)

'Если нажата клавиша <Enter>,

If KeyAscii = 13 Then

'Отменяем возвращаемый символ

KeyAscii = 0

'Вызываем общую процедуру ВычислениеОбъема

ВычислениеОбъема

End If

End Sub

Оцените преимущества использования общей процедуры, сравнив приведенные варианты с использовавшимися для текстовых окон в предыдущем проекте.

Сохранение проекта

Создайте папку ПРИМЕР5 и сохраните в ней форму и проект под именами конус.frm и конус.vbp.

Тестирование приложения

§ Запустите программу.

§ Обратите внимание, что объем вычисляется только тогда, когда вы нажимаете клавишу .

Взгляд назад

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

Пояснения

* Вы можете использовать элемент управления PictureBox (Блок картинки), чтобы добавить готовые картинки, которые вы создали сами. При этом, однако, вам, возможно, придется изменить размер блока для изображения, которое вы собираетесь вставить. Свойство Picture (Картинка) элемента управления PictureBox устанавливается для графических файлов. В Visual Basic можно работать с различными графическими форматами файлов: bmp, jpg, ico, gif и др.

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

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

* В общей процедуре ВычислениеОбъема была объявлена константа (в отличие от переменной величины): Const Pi = 3.14. Значение константы не может изменяться в процедуре, в которой она определяется. При объявлении константы сразу задается и ее имя, и ее значение.

* Событие KeyPress, как и другие события, имеет готовую оболочку процедуры его обработки, которая вам предоставляется. Это так называемый “шаблон кода”. В заголовке предусмотрены также все необходимые аргументы. Аргументы — это входные точки для информации, входящей в процедуру извне. Говорят, что информация передается в процедуру через ее аргументы. Аргументом процедуры txtРадиус_KeyPress (как и процедуры txtВысота_KeyPress) является KeyAscii. Каждый раз, когда нажимается клавиша, этому аргументу передается целое значение. Каждая клавиша на клавиатуре ассоциируется с некоторым значением (так называемым “ASCII-кодом”). Клавише соответствует целое число 13.

* Оператор присваивания KeyAscii = 0 отменяет символ, который был напечатан. Без этой строки был бы сигнал при нажатии клавиши .

* В этом примере появляется операция возведения в степень (^). В Visual Basic х2 записывается как х ^ 2.

* Формула для вычисления объема имеет вид:

V = 1 / 3 * Pi * Val(txtРадиус.Text) ^ 2 *

Val(txtВысота.Text)

Значение объема форматируется таким образом, чтобы после десятичной точки была одна цифра. lblОбъем.Caption = Format(V, "#,##0.0")

Причем если значение объема превышает тысячу, то вставляется разделитель — в формате для этого используется запятая.

* И снова функция Val обеспечивает защиту от ввода ошибочных данных. Улучшенный способ для подтверждения ввода числовых данных — использование функции IsNumeric. Эта функция возвращает значение True или False в зависимости от того, является ли ее аргумент числом или нет. Например, IsNumeric(txtРадиус.Text)будет иметь значение True, если введено числовое значение свойства Text текстового окна txtРадиус. Посмотрите, как эта функция могла бы быть использована в гораздо более строгой процедуре ВычислениеОбъема:

Private Sub ВычислениеОбъема()

Const Pi = 3.14

If IsNumeric(txtРадиус.Text) And

IsNumeric(txtВысота.Text) Then

V = 1 / 3 * Pi * Val(txtРадиус.Text) ^ 2 *

Val(txtВысота.Text)

lblОбъем.Caption = Format(V, "#,##0.0")

Else

Beep

lblОбъем.Caption = "Ошибка ввода"

End If

End Sub

Таким образом, объем будет вычислен и выведен только в том случае, если содержимое обоих текстовых окон есть числа.

Вопросы и задания для проверки знаний

1. В каком случае целесообразно использовать общую процедуру?

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

3. Какой аргумент используется в шаблоне кода для процедуры обработки события “Нажатие на клавишу”? Как этот аргумент получает значение?

4. Программа использует в качестве константы величину g со значением 9,8. Напишите строку кода для объявления этой величины.

5. В Visual Basic приоритет выполнения арифметических операций такой же, как и в математике: сначала скобки, потом возведение в степень, далее умножение и деление (слева направо), потом сложение и вычитание (слева направо). Вычислите значения следующих выражений:

a) 5 – 4 ^ 2;

б) 12 ^ 2 + 5 ^ 2;

в) (13 – 9) ^ (8 Mod 3);

г) 8 \ 5 * 2 ^ 3;

д) 9 – (6 ^3 Mod 2).

6. Числовая функция Sqr возвращает квадратный корень числа (при условии, что ее аргумент — неотрицательное число). Каково значение следующего выражения: Sqr(7 ^ 2 + 24 ^ 2)?

7. Усовершенствуйте рассмотренный проект путем применения функции IsNumeric.

8. Вернитесь к примеру программирования 4 и улучшите его путем применения общей процедуры.

9. Ваши приложения будут выглядеть лучше, если в качестве фона вы будете использовать полный экран выбранного цвета. Это может быть достигнуто добавлением другой формы (Add Form из меню Project или соответствующая кнопка на панели инструментов). Установите следующие свойства: для свойства BackColor формы Form2 установите цвет по вашему выбору (двойным щелчком по палитре), BorderStyle установите в 0 – None и WindowState в 2 – Maximized. Потом добавьте следующий код для формы Form2:

Private Sub Form_Activate()

Form1.Show 1

End Sub

После этого нужно установить форму Form2 в качестве формы, появляющейся при запуске приложения. Из меню Project (Проект) выберите пункт Project Properties… (Свойства Проекта…) и в появившемся диалоговом окне в качестве Startup Object (Объект загрузки) выберите Form2.

Для надежности вам следует установить свойство ControlBox формы Form1 в False.

10. Если бы программа вычисляла объем сферы (V = 4/3pr3) после ввода значения радиуса, то какой оператор присваивания надо было бы написать, чтобы рассчитать его значение? Пользуясь указанной формулой, разработайте приложение (с соответствующей графикой) для вычисления объема сферы.

Литература

1. Тимофеева Н.М. Диаграммы Насси — Шнайдермана. / “В мир информатики” № 67 (“Информатика” № 2/2006).

Продолжение