Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по VB. Часть2.doc
Скачиваний:
23
Добавлен:
02.02.2015
Размер:
870.4 Кб
Скачать

11.5. Использование процедур и функций при решении экономической задачи

Рассмотрим использование аппарата процедур и функций на примере задачи о поиске изделия с максимальной потребностью в стали, которая рассматривалась в п. 10.5.

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

  1. Поиск изделия с максимальной потребностью в стали

  2. Вывод информации о найденном изделии

Каждый подэтап оформляется в виде процедуры (Поиск и ВыводМах).

11.5.1. Код проекта

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

При описании процедур формальные параметры указываются с их типами:

Поиск(sngMaxПотребность As Single, iMax As Integer)

и

ВыводMax(sngMaxПотребность As Single, iMax As Integer)

Код тел этих процедур полностью повторяет код соответствующих фрагментов предыдущего примера за исключением того, что для вычисления потребности в стали на один вид изделия (Норма * Количество) используется функция fncПотребность, формальными параметрами которой являются sngНорма и intКоличество. Результат функции принадлежит к дробному типу (Single), что и указано в заголовке функции. Тело функции в данном примере достаточно простое. Оно состоит из одного оператора присваивания, в левой части которого указано имя функции.

Процедуры Поиск и ВыводМах соответствуют подэтапам этапа «Максимальная потребность». Этот этап реализуется процедурой Максимальная_потребность. Поскольку эта процедура не получает никаких данных от предыдущих этапов, а последующих этапов совсем нет, то она не имеет параметров (после имени в описании поставлены пустые скобки).

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

При вызове функции fncПотребность в процедуре Поиск в качестве фактических параметров указаны поля записи udtСведения, что отражено точками перед именами полей.

Процедура Максимальная_потребность вызывается из процедуры cmdМаксимальная_потребность_Click, которая обрабатывает событие "Щелчок на кнопке «cmdМаксимальная_потребность»". Поскольку процедура Максимальная_потребность не имеет параметров, то при ее вызове указывается только имя процедуры.

Таким образом, этап поиска изделия с максимальной потребностью в стали имеет иерархическую структуру управления: процедура обработки события щелчка на кнопке «cmdМаксимальная_потреб-ность_Click» вызывает процедуру общего назначения Максимальная_потребность, а та в свою очередь – процедуры общего назначения Поиск и ВыводМах. Процедура Поиск вызывает функцию fncПотребность. Вызов процедур и функции может быть представлен схемой (рис. 11.1).

Процедура сmdМаксимальная_потребность_Click хранится вместе с формой frmПотребность_в_стали, а процедуры общего назначения Максимальная_потребность, Поиск и ВыводМах, а также функция fncПотребность – в модуле «Общие_описания».

Рис. 11.1. Схема вызова процедур и функций

Вместе с формой frmПотребность_в_стали также хранятся процедуры cmdСоздание_Click и cmdВывод_Click, а вместе с формой frmВид_продукции хранится процедура cmdЗаписать_Click. Эти процедуры полностью совпадают с одноименными процедурами предыдущего проекта и поэтому здесь не приводятся.

Код процедуры сmdМаксимальная_потребность_Click и использующихся в ней процедур общего назначения приведен ниже:

Option Explicit

'Пользовательский тип данных

Public Type Запись

strНаименование As String * 7

sngНорма As Single

intКоличество As Integer

End Type

'Переменная пользовательского типа

Public udtСведения As Запись

'Счетчик записей

Public i As Integer

Public Sub Максимальная_потребность()

Dim sngMaxПотребность As Single

Dim iMax As Integer 'Номер максим. изделия

Call Поиск(sngMaxПотребность, iMax)

ВыводMax sngMaxПотребность, iMax

End Sub

Public Sub Поиск(sngMaxПотребность As Single, iMax As Integer)

'Открытие файла

Open frmПотребность_в_стали.txtИмя_файла _

For Random As #1 Len = Len(udtСведения)

'Чтение первой записи

i = 1

Get #1, i, udtСведения

With udtСведения

'Предположение, что максимум будет у первого изделия

sngMaxПотребность = fncПотребность(.sngНорма, .intКоличество)

iMax = i

'Определение максимума путем сравнения

' потребностей в стали по остальным изделиям

Do

i = i + 1

Get #1, i, udtСведения

If fncПотребность(.sngНорма, .intКоличество) > sngMaxПотребность Then

sngMaxПотребность = fncПотребность(.sngНорма, .intКоличество)

iMax = i

End If

Loop Until EOF(1)

End With

End Sub

Public Sub ВыводMax(sngMaxПотребность As Single, _

iMax As Integer)

'Чтение записи с максим. потребностью

Get #1, iMax, udtСведения

'Вывод пустой формы для информации по максим. потребности

frmМаксимальная_потребность.Show

With udtСведения

'Вывод информации по изделию с максим. потребностью

frmМаксимальная_потребность.Print _

Tab(1), "Наименование:"; Tab(33); .strНаименование, _

Tab(1), "Норма:"; Tab(33); .sngНорма, _

Tab(1), "Количество:"; Tab(33); .intКоличество, _

Tab(1), "Потребность:"; Tab(33); sngMaxПотребность

End With

'Закрытие файла

Close #1

End Sub

Public Function fncПотребность(sngНорма As Single, _

intКоличество As Integer) As Single

fncПотребность = sngНорма * intКоличество

End Function