Пример решения задачи Постановка задачи
Предприятие выпускает несколько видов продукции, на изготовление которых используется сталь. Определить вид продукции, на который тратят стали больше всего, если известно:
норма затрат стали на единицу продукции i-го вида (в килограммах);
плановое задание на выпуск i-го вида продукции (в штуках).
Экономико-математическая модель
Потребность в стали на производство і-го вида определяется по формуле
Потребностьі = Нормаі * Количествоі
где Нормаі - затраты стали на изготовление одного продукта і-го вида;
Количествоі –план выпуска продуктов і-го вида;
n –количество видов продукции.
Необходимо определить максимальное значение величин Потребностьі , если і=1,2,…, n.
Алгоритм решения задачи
Решение задачи имеет три основных этапа:
Создание файла данных.
Отображение содержимого файла.
Вычисление максимальной потребности.
Упрощённая схема алгоритма представлена на рис. 1.1.
На этапе «Создания файла данных» вводят данные по каждому виду продукции и сохраняют на диске.
На этапе «Отображение содержимого файла» осуществляется чтение из файла данных по каждому виду продукции и вывод их на форму
На этапе «Вычисление максимальной потребности» читаются из файла данные о первом виде продукции, вычисляется необходимость в стали на его производство и допускается, что затраты металла будут максимальные. Далее это предположение проверяют, сравнивая с потребностями в стали на другие виды продукции. При этом запоминают номер записи в файле (iMax), которая содержит данные о текущем максимуме. Эти данные, после полного просмотра файла, выводят на пустую форму. Алгоритм поиска построен с учетом того, что файл содержит не меньше двух записей
Структура данных
Для хранения данных о видах продукции в приложении используют дисковый файл. Каждый вид продукции имеет следующие характеристики (реквизиты):
Наименование – строка символов (не более 7 символов, имя Name);
Норма – дробное число (тип Single, имя Norma);
Количество – целое число (имя Kol).
Эти простые переменные касаются одного вида продукции, поэтому объединяются в тип данных пользователя Zap. Для выполнения действий с данными типа Zap в программе используется переменная типа данных пользователя Sved, которая состоит из перечисленных выше полей. Эта переменная употребляется для записи данных в файл и чтения из него.
Величина Потребность (число дробное, имя Potr) хотя и касается каждого вида продукции, но в файл не записывается, так как является вычисляемой, при необходимости её можно вычислить.
Переменная Sved используются в разных частях приложения. Поэтому она, а также тип Zap, на основе которого определяется эта переменная, описываются в отдельном модуле общих описаний с атрибутами Public (общедоступный). Здесь же, описывают переменную і целого типа, она является номером выбора и будет использоваться в кодах разных форм.
Рис. 1.1. Упрощенная система алгоритма
Имя файла - последовательность символов вводится в текстовое поле с именем Тext1.text.
Для определения количества записей в файле перед началом чтения из него используется переменная Kol_zap типа Integer.
При поиске вида продукции с максимальной затратой стали используется переменная типа Single MaxPotr и переменная типа Integer іMax, в которой сохраняется номер записи с соответствующими данными. Используемые переменные представлены в табл. 9.1.
Таблица 9.1. Используемые переменные
Реквизиты |
Имя |
Назначение |
Имя файла |
Text1.text |
Имя файла на диске для хранения данных по всем видам продукции |
Запись |
Zap |
Тип данных, которые сохраняются в файле |
Сведения |
Sved |
Переменная типа Zap |
Наименование |
Name |
Наименование вида продукции, поле в типе данных пользователя Zap |
Норма |
Norma |
Норма затрат стали на выбор одного вида, поле в типе данных пользователя Zap |
Количество |
Kol |
План выпуска продуктов одного вида, поле в типе данных пользователя Zap |
Потребность |
Potr |
Потребность стали на один вид продукции |
Мах Потребность |
МахPotr |
Максимальная потребность стали на один вид продукции |
іМах |
iМах |
Номер записи, в которой сохраняются данные по виду продукции с максимальной затратой стали |
Количество записей |
Kol_zap |
Количество записей в файле |
Интерфейс с пользователем.
Общая величина, для всех трёх этапов решения задачи - имя файла. Его вводят в текстовое поле на главной форме «Потребность в стали» (рис. 1.2.)
Рис. 1.2. Главная
форма приложения
В
ыполнение
каждого этапа начинается после нажатия
соответствующей кнопки на главной
форме. Этап создания файла реализуется
путём нажатия на кнопку «Создание», при
этом появляется форма «Вид продукции»
(рис. 1.3.)
Рис. 1.3. Форма «Вид продукции»
С самого начала форму «Вид продукции» можно закрыть, нажав на кнопку закрытия формы. В этом случае в файл не будет записано ни одной записи. Если же ввести на форме данные по виду продукции, а затем нажать на кнопку «Записать», то эти данные будут сохранены в файле. После этого можно или закрыть форму «Вид продукции» (приостановив заполнение файла), или ввести данные по новому виду продукции и нажать на кнопку «Записать». Этот процесс можно повторять столько раз, сколько видов продукции выпускает предприятие.
Второй этап решения задачи реализуется путём нажатия на кнопку «Вывод содержимого» и отображением всех записей файла на форму «Содержимое файла» (рис. 1.4.) при этом каждая запись занимает отдельную строку.
Рис. 1.4. Форма «Содержимое файла»
Третий этап выполняется нажатием кнопки «Максимальная потребность» при этом на соответствующую форму будет выведена информация о виде продукции с максимальной затратой стали (рис. 1.5.) данные об изделии выводятся в столбик.
Рис. 1.5. Форма «Максимальная потребность»
Код проекта
Общие для всего приложения величины описывают в отдельном модуле «Общие описания». Он содержит следующие операторы:
'Общие описания
Option Explicit
'Тип данных пользователя
Public Type zap
Name As String * 7
Norma As Single
Kol As Integer
End Type
'Переменная типа данных пользователя
Public sved As zap
'Счетчик записей
Public i As Integer
Форма «Потребность в стали» имеет три кнопки. Нажатие на каждую из них обрабатывается соответствующей процедурой. Коды процедур представлены ниже:
Private Sub Command1_Click() ‘Создание файла
'Открытие файла
Open Text1 For Random As #1 Len = Len(sved)
'ввод данных по одному виду продукции и запись на диск
'повторяется многократно
i = LOF(1) / Len(sved) + 1 ‘ номер первой свободной записи в файле
Form2.Show
End Sub
Private Sub Command3_Click() ‘Вывод содержимого файла
Dim kol_zap As Integer
'Открытие файла для чтения
Open Text1 For Random Access Read As #1 Len = Len(sved)
'Вывод простой формы для отображения содержимого файла
Form3.Show
'Определение количества записей файла
kol_zap = LOF(1) / Len(sved)
' Чтение из файла, отображение записей на форму
For i = 1 To kol_zap
Get #1, i, sved
'Печать записи на форму
Form3.Print sved.Name, sved.Norma, sved.Kol
Next i
'Закрытие файла
Close #1
End Sub
Private Sub Command2_Click() ‘Вычисление максимальной потребности
Dim Potr, MaxPotr As Single
Dim imax As Integer
Dim kol_zap As Integer
'Открытие файла для чтения
Open Form1.Text1 For Random Access Read As #1 Len = Len(sved)
i = 1
Get #1, i, sved
'Вычисление потребности в стали для первого изделия
Potr = sved.Norma * sved.Kol
MaxPotr = Potr
imax = i
'Вычисление максимума путем сравнения
' потребностей по другим изделиям
kol_zap = LOF(1) / Len(sved)
For i = 2 To kol_zap
Get #1, i, sved
Potr = sved.Norma * sved.Kol
If Potr > MaxPotr Then
MaxPotr = Potr
imax = i
End If
Next i
'Чтение записи с максимальной потребностью
Get #1, imax, sved
'Отображение информационной формы
Form4.Show
'Отображение результирующей информации
Form4.Print
Form4.Print Tab(3), "Наименование"; Tab(33); sved.Name
Form4.Print Tab(3), "Норма"; Tab(33); sved.Norma
Form4.Print Tab(3), "Количество"; Tab(33); sved.Kol
Form4.Print Tab(3), "Потребность"; Tab(33); MaxPotr
Close #1
End Sub
Форма «Вид продукции» предназначена для ввода данных по одному виду продукции и сохранения их в файле. Эти действия выполняются после события нажатие на кнопку «Записать». Кроме этого, после события «Закрытие формы» файл закрывается. Тексты процедур, которые обрабатывают эти два события, поданы ниже:
Private Sub Command1_Click() ‘ Занесение данных в файл
'Ввод данных по виду продукции
sved.Name = Text1.Text
sved.Norma = CSng(Text2.Text)
sved.Kol = CInt(Text3.Text)
'Запись в файл
Put #1, i, sved
'Очистка полей от предыдущих данных
i = i + 1
Text1.Text = ""
Text2.Text = "0"
Text3.Text = "0"
End Sub
Private Sub Form_Unload(Cancel As Integer) ‘ Закрытие формы
Close #1
End Sub
Формы «Содержимое файла» и «Максимальная необходимость» процедур не имеют.
Реализация проекта
Запустить на выполнение VB для создания нового проекта.
Создать модуль «Общие описания».
На стандартной панели инструментов нажать стрелку правее от кнопки добавление нового объекта (вторая левее) и выбрать команду Add Module.
В диалоговом окне, что появилось, вкладыше New выбрать значение Module и нажать кнопку «Открыть».
В окно кода, что появилось, ввести необходимые описания (код модуля «Общие описания»).
На стандартной панели инструментов нажать на кнопку «Сохранить». В диалоговом окне Save File As, которое появилось, в поле Папка указать необходимую папку, а в поле Имя файла ввести название модуля ob-opis-1, после чего нажать на кнопку «Сохранить».
В окне свойств модуля к свойству Name ввести имя Общие_описания.
Создать форму «Потребность в стали».
перейти в окно формы, которое появилось при открытии нового проекта.
Задать заголовок и имя формы.
Создать текстовое поле с соответствующей надписей для ввода имени файла.
Создать три командные кнопки «Создание», «Вывод содержимого» и «Максимальная потребность».
Ввести коды процедур для обработки событий, связанных с командными кнопками.
Сохранить форму в папке на диске.
Создать форму «Вид продукции».
На стандартной панели инструментов нажать на стрелку правее от кнопки добавление нового объекта и выбрать команду Add Form.
В диалоговом окне AddForm, которое появилось, выбрать значок «Form» и нажать кнопку «Открыть».
Задать заголовок форме «Вид продукции» и её имя.
Создать три текстовых поля Наименование, Норма, Количество и соответствующие надписи для них.
Создать командную кнопку «Записать» и ввести код процедуры, которая обрабатывает событие нажатия мышкой на неё.
Сохранить форму в папке на диске.
Создать форму «Содержимое файла».
Повторить п. 4.1. и 4.2.
Задать заголовок формы «Содержимое файла» и её имя.
Сохранить форму в папке на диске.
Создать форму «Максимальная потребность». Выполняется аналогично п. 5.
Сохранить весь проект в папке на диске.
Анализ проекта.
Проект состоит из четырёх форм и одного модуля общих описаний. Главной является форма «Потребность в стали». Она управляет работой других форм с помощью соответствующих процедур.
Поскольку каждый из трёх этапов начинается открытием файла и заканчивается его закрытием, то можно считать, что этапы выполняются независимо. Отсюда следует, что после ввода имени файла работу можно начинать с любого этапа. Если файл с введенным именем уже существует, то сразу можно найти вид продукции с максимальной затратой стали или предварительно познакомится с содержимым всего файла.
Для вывода пустой формы в коде используется метод Show соответствующей формы, например: Form3.Show
Для вывода данных на форму используется метод Print этой формы.
Обратим внимание, что при чтении/записи в файл используется сложная переменная типа данных пользователя Sved. Одновременно передаются значения всех её трёх полей (Name, Norma, Kol). В методе Print необходимо указать либо каждое поле отдельно в полной форме, указывая имя переменной-записи Sved, или в сокращенной, используя оператор With.
Отдельные элементы вывода в методе Print разделяются запятой или точкой с запятой. Если разделитель запятая, то значение будет представлено в 14-символьной зоне вывода, а если точкой с запятой – значения выводятся подряд, без разрыва. Кроме того, в элементах вывода могут использоваться функции Spc(n) (для вставки n пробелов между значениями в текстовой строке) и Tab(n) (для указания номера позиции n для начала вывода следующего элемента). Если в текущей строке позиция n уже занята и используется функция Tab(n), то вывод будет совершаться в следующей строке с n-й позиции. В примере функция Tab(n) использована для вывода в один столбец данных по виду продукции с максимальной затратой стали. При этом, название реквизита выводится, начиная с первой позиции каждой строки, а его значение – с 33 позиции этой же строки.
Используя функции Spc(n) и Tab(n) можно выводить данные в виде табличного документа.
Выполнение программы и получение результатов.
Цех по изготовлению крепёжных изделий получил заказ, данные о котором даны в табл. 1.2. Необходимо найти вид изделий с наибольшей материалоёмкостью.
Таблица 9.2. Данные о заказе на крепежные изделия
-
Наименование
Норма расхода стали
на одно изделие, кг
Количество, шт.
Болт
0,05
1 000
Гайка
0,025
1 000
Шуруп
0,03
5 000
гвинт
0,02
2 000
