Программирование в Delphi
МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА И ПРОДОВОЛЬСТВИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
Учреждение образования «Белорусский государственный аграрный технический университет»
Факультет: Предпринимательства и управления
Кафедра: Экономической информатики
Курсовой проект
Тема: «ПРОГРАМИРОВАНИЕ В DELPHI»
Выполнил студент II курса
группы 52-ЗЭИ
Зачетная книжка №506020
Братулин Евгений Петрович
Проверил:_______________
Минск 2007
CОДЕРЖАНИЕ
1. Введение 3
2. Постановка задачи 4
3. Математическая формулировка задачи и выбор метода обработки информации 7
4. Разработка алгоритма схемы алгоритма и его описание 9
5. Форма представления исходных данных 21
6. Разработка интерфейса 22
7. Листинг программы 25
8. Результаты проведенных расчетов и их анализ 32
Выводы 35
Список использованных источников. 36
Приложения. 37
1. Введение.
В данной курсовой работе предложено создать Windows-приложение на алгоритмическом языке Object Pascal в среде визуального программирования Delphi, которое как планируется, будет обеспечивать решение специализированных задач по формированию, обработке на ЭВМ и выводу информации.
Разработчику ставиться вполне определенная задача, при выполнении которой используются навыки работы с операционными системами, программными оболочками, разнообразными служебными и сервисными средствами. А также навыки по алгоритмизации, программированию и решению в интегрированной визуальной среде программирования Delphi задач по экономике и управлению на предприятии.
2. Постановка задачи.
В данной курсовой работе требуется создать Windows-приложение на алгоритмическом языке Object Pascal в среде визуального программирования Delphi, которое обеспечивает формирование, обработку на ЭВМ и вывод информации. Предусмотреть хранение информации в типизированных файлах, содержащих не менее 10 записей. Приложение должно обеспечивать формирование базы данных сведений о выручке от реализации продукции за плановый период, выполнить математические вычисления по расчету объема реализации и стоимости в оптовых ценах всего объема реализации. Также необходимо обеспечить сортировку базы данных в алфавитном порядке по наименованию продукции и организовать вывод в MEMO-поле наименование продукции, имеющее значение наибольшей стоимости.
Степень рациональности создания данной программы оценивается как низкая. Исходя из начальных условий, необходимо выполнить тривиальную последовательность действий:
- хранение малого объема данных
- произведение простых математических вычислений
- обеспечение хранение базы данных
При исследовании существующих программных продуктов, был сделан вывод, что используя комплексное программное обеспечение компании Microsoft, на базе электронных таблиц Excel или базы данных Access можно было создать такое же приложение, выполняющее поставленную задачу. При этом затрачивается минимум усилий на проработку интерфейса и процедур сортировки. Однако, большим минусом данного решения будет является необходимость обязательной предварительной установки программного обеспечении Microsoft Office, лицензионные версии которого не получили широкого распространения на территории Республики Беларусь.
Поэтому принято считать, что уже исходя из этого разрабатываемое Windows- приложение не является «бесполезным», потому как имеет одну четко сформировавшуюся цель и место применения. Вероятное использование данного продукта - финансовые терминалы на базе операционных систем семейства Windows любого производственного предприятия. Данная программа, используя стандартные компоненты, с успехом будет работать в ОС-ах Windows’95, 98, 2000, ХР не требуя при этом дополнительных инсталляций программного обеспечения.
Для создания подобного приложения, которое будет удовлетворять поставленную задачу, и обеспечения функционирования математического аппарата необходимо как минимум:
Один компонент для визуального представления данных в табличной форме,
MEMO-поле для вывода данных, указанных в задании
Набор компонентов для добавления / изменения / удаления записей в базу данных
Диалоговые окна, обеспечивающие выбор файлов для открытия / сохранения базы данных с соответствующими кнопками для их вызова.
Также необходимо обязательно создать дополнительные подпрограммы, обеспечивающие непосредственно математический аппарат основной программы и сортирование базы данных.
Таким образом, учитывая вышесказанное, разработчиком были приняты следующие решения, касающиеся будущей структуры приложения:
для визуального отображения данных в табличной форме выбрать компонент StringGrid, который в текстовой форме обеспечивает ввод, изменение, удаление и просмотр данных. Шапка таблицы будет повторять таблицу, указанную в начальном условии. Предустановленное максимальное количество данных – 100 записей, что также удовлетворяет начальному условию
MEMO-поле прежде всего предназначенное для вывода данных, указанных в условии, дополнительно использовать для визуального подтверждения выполняемых пользователем действий.
для добавления / изменения / удаления записей в базу данных использовать 5 компонентов edit (для заполнения соответствующих столбцов), и 2 button-а (для добавления и удаления записи соответственно). Так как для отображения информации в StringGrid используется текстовая форма, предусмотреть невозможность ввода текстовых данных в численные поля с выводом соответствующего сообщения, а также невозможность внесения «пустого» поля, так как все поля базы данных, необходимые для математического расчета по условиям задачи должны быть заполнены.
использовать стандартные диалоги OpenDialog и SaveDialog для предоставления пользователю возможности визуального выбора имени и пути типизированного файла для открытия либо для сохранения базы данных. Для вызова диалогов использовать 2 компонента button с соответствующими названиями
для «обнуления» данных, т.е. создания новой базы использовать компонент button с подписью «создать базу».
для дублирования функций программы и создания дополнительного удобства работы с приложением применить компонент menu с соответствующими подменю и подписями кнопок.
математический аппарат представить в виде отдельной процедуры, состоящей из двух уравнений, удовлетворяющих начальному условию, которые являются необходимой частью приложения. Расчет проводить в автоматизированном режиме, без участия пользователя.
выполнить сортирование базы данных в автоматизированном режиме. Что исключит лишние действия пользователя по периодическому нажатию кнопки «сортировка». Действие сортировки выполнить уникальным, специально разработанным методом при каждом изменении базы данных.
3. Математическая формулировка задачи и выбор метода обработки информации
В поставленной задаче необходимо выполнить простейшие операции и вычисления. Математический аппарат представлен в виде вычисления двух неизвестных по заранее заданным формулам.
1) из базы данных выделить сведения на каждую запись об остатке на начало года, об остатке на конец года, о плане выпуска, а также стоимость в оптовых ценах единицы продукции.
2) выполнить вычисление объема реализации по формуле, указанной в задании.
3) выполнить вычисление стоимости в оптовых ценах всего объема реализации по формуле, указанной в задании.
Поиск наименования продукции, обладающей наибольшую стоимость всего объема реализации, происходит методом прямого перебора базы данных, сравнивая каждый последующий элемент с предыдущим. При обнаружении последующего элемента большим, чем предыдущий, значение стоимости записывается в одну буферную переменную, а индекс строки записывается во вторую. При окончании перебора в поле MEMO выводится наименование продукции из базы данных, соответствующей записанному ранее индексу, а значение переписывается из буферной переменной.
Элемент автоматической сортировки встроен в систему вывода информации через компонент StringGrid. Для этого используется типизированный массив набора данных. При добавлении новой записи происходит перенос данных из StringGrid-а в типизированный массив и затем происходит прямой перебор базы данных с поиском наиболее большего в текстовом смысле значения наименования продукции с использованием функции CompareText. При определении первого большего элемента добавляемая запись записывается между строк типизированного массива, а затем все «не пустые» записи типизированного массива переносятся в уже очищенный StringGrid. Затем типизированный массив очищается.
Таким образом исключается необходимость участия пользователя в процессе сортировки данных. Ход процесса перестроения базы данных как бы вмонтирован в операции по изменению данных. То есть конечной целью разработчика являлась создание унифицированной процедуры по преобразованию массива данных.Однако, данный метод (ровно как и метод «пузырька») применим только для малых объемов баз данных, так как преобразование большого массива информации потребует значительные ресурсы. Поэтому набор данных намеренно был ограничен 100 записями, что в полной мере удовлетворяет поставленному условию (оперирование с более чем десятью записями).
Дальнейшим возможным развитием программы может быть использование стандартизированных типов баз данных со встроенной системой индексации и поиска, со встроенными функциями сортировки. Также возможно интегрирование типизированных файлов с программами Microsoft Office Excel или Access. Также, при необходимости, возможно доработать программу до клиент/серверного положения, которое будет иметь общую систему защищенных баз данных, удобное управление, а также распределение полномочий по добавлению/изменению/удалению записей.
4. Разработка алгоритма, схема алгоритма и его описание.
На основе вышеизложенной математической формулировки задачи, составляем соответствующие подпрограммы:
1
1
Начало
2
Sg1.cells
. процедура выполнения действий при загрузке формы: FormShow.Пояснения к алгоритму 1:
Блок 2 – задание имен фиксированным столбцам в StringGrid.
Б
3
memo1.Lines
лок 3 – вывод в поле memo сообщения о запуске.
4
Конец
2
1
Начало
. процедура очистки StringGrid: CleanSG.
n2=1, Sg1.Rowcount,1
2
Пояснения к алгоритму 2:Б
Sg1.rows[n2].clear
лок 2 – цикл перемещения по строкам StringGrid.Б
3
лок 3 – очистка строки StringGrid.
4
Конец
3. процедура очистки edit-ов: clearedit.
1
Начало
2
Пояснения к алгоритму 3:Б
edit1.clear
локи 2-6 – очистка edit-ов.
А
B
3
edit2.clear
4
edit3.clear
5
edit4.clear
6
edit5.clear
7
Конец
4. процедура создания новой базы: button4click.
1
Начало
Пояснения к алгоритму 4:
Б
messagedlg
2
Да
Нет
лок 2 – запрос удаления несохраненных данных.Блок 3 – вызов процедуры.
Б
cleansg
3
лок 4 – вывод в поле memo подтверждение создания базы.
memo1.lines.insert
4
7
Конец
5. процедура добавления записи: button1click.
Пояснения к алгоритму 5:
Блок 2 – проверка edit-ов на не пустые строки.
Блок 3 – попытка присвоить строке целочисленные переменные.
сообщение о необходимости полей 2…5 быть числом.
Блок 4 – задание начального условия цикла.
Блоки 5,6 – цикл очистки типового массива.
Блок 7 – задание начального условия цикла.
Блоки 8,9,10 – цикл перевода строки StringGrid в массив записей.
Блок 11 – задание начального условия цикла.
Блоки 12,13,14 – цикл нахождения количества записей больших добавленного значения.
Блок 13 – выполнение условия сравнения текстовых переменных.
Блоки 15,16 – междустрочное добавление записи в массив.
Блок 17 – вызов процедуры.
Блок 18 – задание начального условия цикла.
Блоки 19,20,21,22,23 – цикл перевода массива в StrinпGrid.
Блок 24 – вызов процедуры очистки edit-ов.
Блок 25 – вызов процедуры авторасчета.
сообщение о необходимости всех полей к обязательному заполнению.
1
Начало
Да
Нет
If edit1.text <>'' and edit2.text <>'' and edit3.text <>'' and edit4.text <>'' and edit5.text <>''
2
А
Try:n=strtoint(edit2…5)
3
Да
Нет
messagedlg
B
n = 0
4
n = 0, 200, 1
5
6
Mzap[n].prod:='';
Mzap[n].onng:=0;
Mzap[n].plan:=0;
Mzap[n].onkg:=0;
Mzap[n].svocep:=0;
7
n = 1
n = 1, sg1.rowcount, 1
8
sg1.Cells[0,n]<>''
9
Да
Нет
C
D
А
B
А
B
C
D
Mzap[2*n].prod:=sg1.Cells[0,n];
Mzap[2*n].onng:=strtoint(sg1.cells[1,n]);
Mzap[2*n].plan:=strtoint(sg1.cells[2,n]);
Mzap[2*n].onkg:=strtoint(sg1.cells[3,n]);
Mzap[2*n].svocep:=strtofloat(sg1.cells[5,n]);
10
n = 1, n = 0
11
12
n = 1, 200, 1
13
Да
Нет
(Mzap[2*n].prod<>'') and (CompareText(edit1.Text,Mzap[2*n].prod)>0)
L = L + 1
14
k = 2L + 1
15
Mzap[k].prod:=edit1.Text;
Mzap[k].onng:=strtoint(edit2.text);
Mzap[k].plan:=strtoint(edit3.text);
Mzap[k].onkg:=strtoint(edit4.text);
Mzap[k].svocep:=strtofloat(edit5.text);
16
cleansg
17
n = 1, k = 1
18
19
n = 1, 200, 1
Mzap[n].prod<>''
20
Да
Нет
А
B
C
D
А
B
C
D
sg1.Cells[0,k]:=Mzap[n].prod;
sg1.Cells[1,k]:=inttostr(Mzap[n].onng);
sg1.Cells[2,k]:=inttostr(Mzap[n].plan);
sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);
sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);
21
k = k +1
22
n = n + 1
23
cleanedit
24
А
B
autorachet
25
messagedlg
26
Конец
6. процедура автоматического расчета: autorachet.
Пояснения к алгоритму 6:
Блок 2 – формирование цикла.
Блок 3 – условие математического расчета (при не пустой ячейке - выполняется).
Блок 4 – выполнение математических расчетов.
Блоки 5,6,7 – поиск максимального элемента.
Блок 8 – вывод в поле memo наименование статьи с наибольшим значением.
1
Начало
2
n = 1, sg1.rowcount, 1
Sg1.cells[0,n]<>''
3
Да
Нет
А
B
C
D
Sg1.cells[4,n]:=inttostr(strtoint(cells[1,n])+strtoint(cells[2,n])-strtoint(cells[3,n]));
Sg1.cells[6,n]:=floattostr(strtoint(cells[4,n])*strtofloat(cells[5,n])/1000);
4
А
B
C
D
5
Да
Нет
Sg1.cells[6,n]>max
L = n
6
max = Sg1.cells[6,n]
7
8
memo1.lines
Конец
9
7. процедура сохранения базы: button6click.
Пояснения к алгоритму 7:
Блоки 2,3 – открытие для записи данных.
Блок 4 – задание начального условия цикла.
Блоки 5,6 – повторный цикл очистки массива.
Блок 7 – задание начального условия цикла.
Блоки 8,9,10 – повторение цикла перевода строки StringGrid в массив записей.
Блоки 11,12 – запись в файл.
Блок 13 – закрытие файла.
Блок 14 – вывод в поле memo подтверждения.
1
Начало
assignfile(filezap,filenamezap);
2
rewrite(filezap);
n:=0;
3
n = 0
4
5
n = 0, 200, 1
Mzap[n].prod:='';
Mzap[n].onng:=0;
Mzap[n].plan:=0;
Mzap[n].onkg:=0;
Mzap[n].svocep:=0;
6
7
n = 1
8
n = 1, sg1.rowcount, 1
sg1.Cells[0,n]<>''
9
Да
Нет
Mzap[2*n].prod:=sg1.Cells[0,n];
Mzap[2*n].onng:=strtoint(sg1.cells[1,n]);
Mzap[2*n].plan:=strtoint(sg1.cells[2,n]);
Mzap[2*n].onkg:=strtoint(sg1.cells[3,n]);
Mzap[2*n].svocep:=strtofloat(sg1.cells[5,n]);
10
n = 1, 100, 1
11
12
filezap, mzap[n]
А
сlosefile (filezap);
13
А
14
memo1.lines
Конец
15
8. процедура открытия базы: button5click.
Пояснения к алгоритму 8:
Блоки 2,3 – открытие для чтения данных.
Блок 4 – задание начального условия цикла.
Блоки 5,6 – повторный цикл очистки массива.
Блоки 7,8,9 – чтение из типизированного файла в типизированный массив.
Блок 10 – вызов подтверждения очистки StringGrid.
Блок 11 – задание начального условия цикла.
Блоки 12,13,14,15,16 – повтор цикла перевода массива в StringGrid.
Блок 17 – вызов процедуры расчета.
Блок 18 – вывод в поле memo подтверждения.
1
Начало
assignfile(filezap,filenamezap);
2
reset(filezap);
n:=0;
3
4
n = 0
n = 0, 200, 1
5
Mzap[n].prod:='';
Mzap[n].onng:=0;
Mzap[n].plan:=0;
Mzap[n].onkg:=0;
Mzap[n].svocep:=0;
6
А
А
while not eof(filezap)
7
8
filezap, mzap[n]
n = n + 1
9
cleansg
10
n = 1, k = 1
11
n = 1, 200, 1
12
Mzap[n].prod<>''
13
Да
Нет
14
sg1.Cells[0,k]:=Mzap[n].prod;
sg1.Cells[1,k]:=inttostr(Mzap[n].onng);
sg1.Cells[2,k]:=inttostr(Mzap[n].plan);
sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);
sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);
15
k = k +1
n = n + 1
16
autorachet
17
А
А
18
memo1.lines
Конец
19
9. процедура удаления базы: button3click.
Пояснения к алгоритму 9:
Блок 2 – очистка выбранной строки.
Блок 3 – задание начального условия цикла.
Блоки 4,5 – повторный цикл очистки массива.
Блок 6 – задание начального условия цикла.
Блоки 7,8,9 – повторение цикла перевода строки StrinGrid в массив записей.
Блок 10 – задание начального условия цикла.
Блоки 11,12,13,14,15 – повтор цикла перевода массива в StrinGrid.
Блок 16 – расчет.
1
Начало
sg1.Rows[sg1.Row].Clear;
2
n = 0
3
n = 0, 200, 1
Mzap[n].prod:='';
Mzap[n].onng:=0;
Mzap[n].plan:=0;
Mzap[n].onkg:=0;
Mzap[n].svocep:=0;
4
5
6
n = 1
n = 1, sg1.rowcount, 1
7
А
B
C
А
B
C
sg1.Cells[0,n]<>''
8
Да
Нет
Mzap[2*n].prod:=sg1.Cells[0,n];
Mzap[2*n].onng:=strtoint(sg1.cells[1,n]);
Mzap[2*n].plan:=strtoint(sg1.cells[2,n]);
Mzap[2*n].onkg:=strtoint(sg1.cells[3,n]);
Mzap[2*n].svocep:=strtofloat(sg1.cells[5,n]);
9
n = 1, k = 1
10
n = 1, 200, 1
Mzap[n].prod<>''
Да
Нет
sg1.Cells[0,k]:=Mzap[n].prod;
sg1.Cells[1,k]:=inttostr(Mzap[n].onng);
sg1.Cells[2,k]:=inttostr(Mzap[n].plan);
sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);
sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);
k = k +1
n = n + 1
autorachet
11
12
13
14
15
16
Конец
17
10. клик StringGrid-а.
Пояснения к алгоритму 10:
Б
1
Начало
лок 2 – подтверждение выбора.
2
memo1.lines
3
Конец
11. вызов печати.
Пояснения к алгоритму 11:
Б
1
Начало
лок 2 – вызов стандартного почтового клиента.
2
shellexecute
3
Конец
12. выход.
Пояснения к алгоритму 12:
Б
1
Начало
лок 2 – выход из программы.
1
halt
3
Конец
5. Форма представления исходных данных
По условию поставленной задачи необходимо предусмотреть хранение информации в типизированных файлах. Для решения данного вопроса, необходимо разработать типизированный элемент хранения данных – строку набора базы данных, роль которой в данном приложении будет выполнять переменная «zap», имеющая следующую структуру.
type zap=record
prod:string[80];
onng:longint;
plan:longint;
onkg:longint;
svocep:extended;
end;
Т.е. данная переменная представляет собой линейный массив переменных данных необходимого нам типа. Для организации двумерного массива, опишем в разделе переменных массив «Mzap»:
var
Mzap:array[1..200] of zap; //объявление типа массива записей
Типизированный файл представляет собой набор типизированных элементов, структура и наименование которого описаны в вышеназванном разделе переменных:
filezap: file of zap;
filenamezap:string;
6. Разработка интерфейса
Принимая во внимание поставленную ранее задачу, создаем на форме следующие визуальные компоненты:
- StringGrid - для визуального отображения данных в табличной форме. Шапка таблицы будет повторять таблицу, указанную в начальном условии, и заполняется при открытии формы. Предустановленное максимальное количество строк – 100, столбцов – 7. Ширины столбцов выбираем в соответствии с размерностью данных.
- MEMO-поле для вывода данных, указанных в условии.
- 5 компонентов edit для добавления / изменения / удаления записей в базу данных (компоненты имеют ширину, соответствующую ширинам стобцов, и расположены напротив каждого столбца снизу) (см. рис. 1).
Рис.1. Общий вид приложения.
2 button-а для добавления и удаления записи, названных соответственно выполняемой функции. Так как для отображения информации в StringGrid используется текстовая форма, предусмотрено невозможность ввода текстовых данных в численные поля с выводом соответствующего сообщения, а также невозможность внесения «пустого» поля, так как все поля базы данных, необходимые для математического расчета по условиям задачи, должны быть обязательными для заполнения. Эти события регистрируются специальными предвартельными условиями и при обнаружения несоответствия выводится окно, отображающее наименование ошибки (см. рис.2 и рис.3).
Рис.2. Ошибка при добавлении пустого (пыстых) полей.
Рис.3. Ошибка при добавлении не численного значения.
- использованы стандартные диалоги OpenDialog и SaveDialog для предоставления пользователю возможности визуального выбора имени и пути типизированного файла для открытия либо для сохранения базы данных (См. рис.4).
Рис.4. Стандартное диалоговое окно для открытия базы данных.
Для вызова диалогов использованы 2 компонента button с соответствующими названиями. А для «обнуления» данных, т.е. создания новой базы использовать компонент button с подписью «создать базу».
Для дублирования функций программы и создания дополнительного удобства работы с приложением применен компонент menu с соответствующими подменю и подписями кнопок.
Расположение кнопок и других полей выбрано для гарантированного удобства работы с приложением.
7. Листинг программы
unit EconomInfo;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, Menus, StdCtrls,shellapi;
type
TForm1 = class(TForm)
sg1: TStringGrid;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Button1: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
N8: TMenuItem;
procedure FormShow(Sender: TObject);
procedure cleansg(Sender: TObject);
procedure cleanedit(Sender:TObject);
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure autorachet(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure sg1Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type zap=record // объявление типа записи
prod:string[80];
onng:longint;
plan:longint;
onkg:longint;
svocep:extended;
end;
var
Mzap:array[1..200] of zap; //объявление типа массива записей
filezap: file of zap;
filenamezap:string;
//процедура выполнения действий при загрузке формы
procedure TForm1.FormShow(Sender: TObject);
begin
with sg1 do begin
Cells[0,0]:='Наименование продукции';
Cells[1,0]:='ОнНГ';
Cells[2,0]:='ПВ';
Cells[3,0]:='ОнКГ';
Cells[4,0]:='ОР, шт';
Cells[5,0]:='СвОЦЕП, руб';
Cells[6,0]:='СвОЦВОР, т.руб';
end;
memo1.Lines.Insert(0,DateTimeToStr(Now)+' - Программа запущена!');
end;
//процедура очистки стринггрида
procedure Tform1.cleansg(Sender: TObject);
var n2:integer;
begin
with sg1 do begin
for n2:=1 to RowCount do begin
Rows[n2].Clear;
end;
end;
end;
//процедура очистки эдитов
procedure Tform1.cleanedit(Sender: TObject);
begin
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit4.Clear;
edit5.Clear;
end;
//Создание новой базы
procedure TForm1.Button4Click(Sender: TObject);
begin
if messagedlg('Все несохраненные данные текушей базы будут стерты!',mtconfirmation,mbYesNoCancel,0)=mrYes then begin
cleansg(Sender);
memo1.Lines.Insert(0,DateTimeToStr(Now)+' - Новая база создана. Пожалуйста сохраните, задав новое имя.');
end;
end;
//добавление записи
procedure TForm1.Button1Click(Sender: TObject);
var n,k,l:integer;o:extended;
begin
//проверка на пустые поля edit-ов
if (edit1.Text<>'') and (edit2.Text<>'') and (edit3.Text<>'') and (edit4.Text<>'') and (edit5.Text<>'') then
begin
try
n:=strtoint(edit2.text);
n:=strtoint(edit3.text);
n:=strtoint(edit4.text);
o:=strtofloat(edit5.text);
except
on EConvertError do messagedlg('Поля 2..5 должны быть числом!',mterror,mbOKCancel,1);
end;
//цикл очистки массива записей
n:=0;
repeat
Mzap[n].prod:='';
Mzap[n].onng:=0;
Mzap[n].plan:=0;
Mzap[n].onkg:=0;
Mzap[n].svocep:=0;
n:=n+1;
until n>=200;
//цикл перевода строк stringgrid-a в массив записей
n:=1;
repeat
if sg1.Cells[0,n]<>'' then begin
Mzap[2*n].prod:=sg1.Cells[0,n];
Mzap[2*n].onng:=strtoint(sg1.cells[1,n]);
Mzap[2*n].plan:=strtoint(sg1.cells[2,n]);
Mzap[2*n].onkg:=strtoint(sg1.cells[3,n]);
Mzap[2*n].svocep:=strtofloat(sg1.cells[5,n]);
end;
n:=n+1;
until n>=sg1.RowCount;
//цикл нахождения количества записей больших добавляемого значения
n:=1;l:=0;
repeat
if (Mzap[2*n].prod<>'') and (CompareText(edit1.Text,Mzap[2*n].prod)>0) then l:=l+1;
n:=n+1;
until n>=200;
//междустрочная запись в массив
k:=2*l+1;
Mzap[k].prod:=edit1.Text;
Mzap[k].onng:=strtoint(edit2.text);
Mzap[k].plan:=strtoint(edit3.text);
Mzap[k].onkg:=strtoint(edit4.text);
Mzap[k].svocep:=strtofloat(edit5.text);
cleansg(sender); //вызов очистки стрингрида
//цикл перевода массива записей в стринггрид
n:=1;k:=1;
repeat
if Mzap[n].prod<>'' then begin
sg1.Cells[0,k]:=Mzap[n].prod;
sg1.Cells[1,k]:=inttostr(Mzap[n].onng);
sg1.Cells[2,k]:=inttostr(Mzap[n].plan);
sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);
sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);
k:=k+1;
end;
n:=n+1;
until n>=200;
cleanedit(Sender); //вызов очистки эдитов
autorachet(sender);
end
else messagedlg('Все поля обязательна для заполенения!',mterror,mbOKCancel,1); //вызов предупреждения
end;
//Процедура автоматического расчета
procedure Tform1.autorachet(Sender: TObject);
var n,l:longint; max:extended;
begin
n:=1;
max:=0;
repeat
with sg1 do begin
if cells[0,n]<>'' then begin
cells[4,n]:=inttostr(strtoint(cells[1,n])+strtoint(cells[2,n])-strtoint(cells[3,n]));
cells[6,n]:=floattostr(strtoint(cells[4,n])*strtofloat(cells[5,n])/1000);
if strtofloat(cells[6,n])>max then begin l:=n; max:=strtofloat(cells[6,n]);end;
end;
end;
n:=n+1;
until n>=sg1.rowCount;
memo1.Lines.Insert(0,DateTimeToStr(Now)+' - Расчет произведен. Максимальный СвОЦВОР '+floattostr(max)+' руб. у '+sg1.cells[0,l]);
end;
procedure TForm1.Button6Click(Sender: TObject);
var n:longint;
begin
with savedialog1 do begin
title:='Сохранение базы';
if execute then
begin
filenamezap:=filename;
assignfile(filezap,filenamezap);
rewrite(filezap);
n:=0;
repeat
Mzap[n].prod:='';
Mzap[n].onng:=0;
Mzap[n].plan:=0;
Mzap[n].onkg:=0;
Mzap[n].svocep:=0;
n:=n+1;
until n>=200;
n:=1;
repeat
if sg1.Cells[0,n]<>'' then begin
Mzap[n].prod:=sg1.Cells[0,n];
Mzap[n].onng:=strtoint(sg1.cells[1,n]);
Mzap[n].plan:=strtoint(sg1.cells[2,n]);
Mzap[n].onkg:=strtoint(sg1.cells[3,n]);
Mzap[n].svocep:=strtofloat(sg1.cells[5,n]);
end;
n:=n+1;
until n>=sg1.RowCount;
for n:=1 to 100 do write(filezap,mzap[n]);
closefile(filezap);
end;
end;
memo1.Lines.Insert(0,DateTimeToStr(Now)+' - База сохранена под именем '+filenamezap);
end;
rocedure TForm1.Button5Click(Sender: TObject);
var n,k:longint;
begin
with opendialog1 do begin
title:= 'Открытие базы';
if execute then
begin
filenamezap:=filename;
assignfile(filezap,filenamezap);
reset(filezap);
n:=0;
repeat
Mzap[n].prod:='';
Mzap[n].onng:=0;
Mzap[n].plan:=0;
Mzap[n].onkg:=0;
Mzap[n].svocep:=0;
n:=n+1;
until n>=200;
n:=1;
while not eof(filezap) do
begin
read(filezap,mzap[n]);
n:=n+1;
end;
cleansg(sender);
n:=0;k:=1;
repeat
if Mzap[n].prod<>'' then begin
sg1.Cells[0,k]:=Mzap[n].prod;
sg1.Cells[1,k]:=inttostr(Mzap[n].onng);
sg1.Cells[2,k]:=inttostr(Mzap[n].plan);
sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);
sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);
k:=k+1;
end;
n:=n+1;
until n>=200;
autorachet(sender);
end;
end;
memo1.Lines.Insert(0,DateTimeToStr(Now)+' - База '+filenamezap+ ' открыта');
end;
//процедура удаления записи
procedure TForm1.Button3Click(Sender: TObject);
var n,k:longint;
begin
sg1.Rows[sg1.Row].Clear;
n:=0;
repeat
Mzap[n].prod:='';
Mzap[n].onng:=0;
Mzap[n].plan:=0;
Mzap[n].onkg:=0;
Mzap[n].svocep:=0;
n:=n+1;
until n>=200;
n:=1;
repeat
if sg1.Cells[0,n]<>'' then begin
Mzap[n].prod:=sg1.Cells[0,n];
Mzap[n].onng:=strtoint(sg1.cells[1,n]);
Mzap[n].plan:=strtoint(sg1.cells[2,n]);
Mzap[n].onkg:=strtoint(sg1.cells[3,n]);
Mzap[n].svocep:=strtofloat(sg1.cells[5,n]);
end;
n:=n+1;
until n>=sg1.RowCount;
cleansg(sender);
n:=0;k:=1;
repeat
if Mzap[n].prod<>'' then begin
sg1.Cells[0,k]:=Mzap[n].prod;
sg1.Cells[1,k]:=inttostr(Mzap[n].onng);
sg1.Cells[2,k]:=inttostr(Mzap[n].plan);
sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);
sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);
k:=k+1;
cleanedit(Sender); //вызов очистки эдитов
end;
n:=n+1;
until n>=200;
autorachet(sender);
end;
procedure TForm1.sg1Click(Sender: TObject);
begin
edit1.Text:=sg1.Cells[0,sg1.Row];
edit2.Text:=sg1.Cells[1,sg1.Row];
edit3.Text:=sg1.Cells[2,sg1.Row];
edit4.Text:=sg1.Cells[3,sg1.Row];
edit5.Text:=sg1.Cells[5,sg1.Row];
memo1.Lines.Insert(0,DateTimeToStr(Now)+' - Запись № '+inttostr(sg1.Row)+ ' выбрана');
end;
procedure TForm1.N8Click(Sender: TObject);
begin
ShellExecute(form1.Handle, nil,PChar('mailto:ultrix@tut.by?sub>ject=EcoInfo'),'','', 0);
end;
procedure TForm1.N5Click(Sender: TObject);
begin
halt;
end;
end.
8. Результаты проведенных расчетов и их анализ.
В данной курсовой работе нам необходимо было рассчитать объем реализации и стоимость в оптовых ценах всего объема реализации продукции за плановый период. Для расчетов нам были даны исходные данные о выручке от реализации продукции за плановый период (Табл. 1).
Таблица1. Сведения о выручке от реализации продукции за плановый период.
Наименование продукции |
Остатки на начало года |
План выпуска |
Остатки на конец года |
Объем реализации, шт. |
Стоимость в оптовых ценах единицы продукции, руб. |
Стоимость в оптовых ценах всего объема реализации, тыс. руб. |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Яблоко |
711 |
40000 |
500 |
200000 |
||
Апельсин |
236 |
80000 |
100 |
500150 |
||
Ананас |
348 |
60000 |
200 |
400000 |
||
Мандарин |
117 |
90000 |
50 |
550000 |
||
Грейпфрут |
284 |
50000 |
150 |
450000 |
||
Банан |
173 |
70000 |
300 |
350000 |
||
Абрикос |
513 |
95000 |
450 |
300000 |
||
Персик |
286 |
65000 |
600 |
250000 |
||
Виноград |
482 |
85000 |
300 |
600000 |
||
Груша |
136 |
40000 |
150 |
650000 |
Расчеты производились следующим образом:
Рассчитаем объем реализации продукции за плановый период. Объем реализации, в нашем, случае равен сумме остатков на начало года с планом выпуска за вычетом остатков на конец года по каждому виду реализованной продукции (Табл. 2).
Таблица2. Сведения о выручке от реализации продукции за плановый период.
Наименование продукции |
Остатки на начало года |
План выпуска |
Остатки на конец года |
Объем реализации, шт. |
Стоимость в оптовых ценах единицы продукции, руб. |
Стоимость в оптовых ценах всего объема реализации, тыс. руб. |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Яблоко |
711 |
40000 |
500 |
40211 |
200000 |
|
Апельсин |
236 |
80000 |
100 |
80136 |
500150 |
|
Ананас |
348 |
60000 |
200 |
60148 |
400000 |
|
Мандарин |
117 |
90000 |
50 |
90067 |
550000 |
|
Грейпфрут |
284 |
50000 |
150 |
50134 |
450000 |
|
Банан |
173 |
70000 |
300 |
69873 |
350000 |
|
Абрикос |
513 |
95000 |
450 |
95063 |
300000 |
|
Персик |
286 |
65000 |
600 |
64686 |
250000 |
|
Виноград |
482 |
85000 |
300 |
85182 |
600000 |
|
Груша |
136 |
40000 |
150 |
39986 |
650000 |
Зная стоимость в оптовых ценах единицы продукции, мы можем рассчитать стоимость в оптовых ценах всего объема реализации произведением объема реализации и стоимости в оптовых ценах единицы продукции (Табл. 3).
Таблица3. Сведения о выручке от реализации продукции за плановый период.
Наименование продукции |
Остатки на начало года |
План выпуска |
Остатки на конец года |
Объем реализации, шт. |
Стоимость в оптовых ценах единицы продукции, руб. |
Стоимость в оптовых ценах всего объема реализации, тыс. руб. |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Яблоко |
711 |
40000 |
500 |
40211 |
200000 |
8042200 |
Апельсин |
236 |
80000 |
100 |
80136 |
500150 |
40080020,4 |
Ананас |
348 |
60000 |
200 |
60148 |
400000 |
24059200 |
Мандарин |
117 |
90000 |
50 |
90067 |
550000 |
49536850 |
Грейпфрут |
284 |
50000 |
150 |
50134 |
450000 |
22560300 |
Банан |
173 |
70000 |
300 |
69873 |
350000 |
24455550 |
Абрикос |
513 |
95000 |
450 |
95063 |
300000 |
28518900 |
Персик |
286 |
65000 |
600 |
64686 |
250000 |
16171500 |
Виноград |
482 |
85000 |
300 |
85182 |
600000 |
51109200 |
Груша |
136 |
40000 |
150 |
39986 |
650000 |
25990900 |
Анализируя данные расчета мы можем сказать, что наиболее выгодно для продавца производить и реализовывать по цене 600000 руб. виноград т.к. этот продукт наиболее востребован покупателем и производитель получит за него наибольшую прибыль (51109200 тыс. руб.). Также будет выгодно производить и реализовывать по цене 500150 и 550000 руб. апельсины и мандарины соответственно т.к. за реализацию этих продуктов производитель получит высокую прибыль (40080020,4 и 49536850 соответственно). При производстве таких продуктов как ананасы (400000 руб.), грейпфрут (22560300 руб.), банан (24455550 руб.), абрикос (28518900 руб.), персик (16171500 руб.), груша (25990900 руб.), производитель будет получать хорошую прибыль, но при разных объемах и цене от реализации, подстраиваясь под потребности покупателя. Эти продукты можно было производить под заказ для реализации сторонним покупателем в не основной деятельности. Не выгодным продуктом для производства и реализации по цене 200000 руб. и объеме 40000 шт. является яблоко т.к. этот продукт не приносит хорошей прибыли.
В результате анализа мы можем сделать вывод, что наиболее выгодно для предприятия производить и реализовывать виноград, апельсины и мандарины т.к. эти продукты наиболее востребованы потребителем и влечет большие прибыли для предприятия.
Все расчеты производились в созданной нами программе на алгоритмическом языке ObjectPascal в визуальной среде Delphi. Для удобства расчета и просматривания результатов все наименование товара автоматически располагается в алфавитном порядке. Наибольшую прибыль и результат расчета мы можем видеть в поле memo куда эти данные также заносятся автоматически (рис. 5).
Рис.5. Общий вид приложения с расчетом и результатами.
Выводы
В ходе выполнения курсовой работы получены новые теоретические сведения о современном техническом и программном обеспечении офисной деятельности; привиты практические навыки работы с операционными системами, программными оболочками, разнообразными служебными и сервисными средствами; освоено применение офисного пакета Microsoft Office для автоматизации сбора, хранения, обработки и передачи информации.
Также были углублены и закреплены знания по алгоритмизации, программированию и решению в интегрированной визуальной среде программирования Delphi задач по экономике и управлению на предприятии.
Список использованной литературы
Архангельский А.Я. Программирование в Delphi 6 ––М.: ЗАО «Издательство БИНОМ», 2002г. – 1200 с.
Кандзюба С.П., Громов В.Н. Delphi 6. Базы данных и приложения. Лекции и упражнения. – К.: Издательство «ДинСофт», 2001. – 576 с.
Фаронов В.В. Delphi 6. Учебный курс. Издательство Молгачев С.В., 2001. – 672с.
Программирование в среде Delphi: Лабораторный практикум для студентов всех специальностей. Под общей редакцией Синицына А.К. – Мн.; БГУИР, 1998. – 94 с.
Основы информатики и вычислительной техники. Методические указания к выполнению курсовой работы для студентов факультета предпринимательства и управления специальности Э 03. 02. 00 «Экономическая информатика». Фурунжиев Р.И. – Ротапринт БАТУ, Мн.: 2000. – 25 с.
Архангельский А.Я. Программирование в Delphi 6 ––М.: ЗАО «Издательство БИНОМ», 2002г. – 1200 с.
Кандзюба С.П., Громов В.Н. Delphi 6. Базы данных и приложения. Лекции и упражнения. – К.: Издательство «ДинСофт», 2001. – 576 с.
Фаронов В.В. Delphi 6. Учебный курс. Издательство Молгачев С.В., 2001. – 672с.
Программирование в среде Delphi: Лабораторный практикум для студентов всех специальностей. Под общей редакцией Синицына А.К. – Мн.; БГУИР, 1998. – 94 с.
Основы информатики и вычислительной техники. Методические указания к выполнению курсовой работы для студентов факультета предпринимательства и управления специальности Э 03. 02. 00 «Экономическая информатика». Фурунжиев Р.И. – Ротапринт БАТУ, Мн.: 2000. – 25 с.
Приложения
К данному курсовому проекта прилагается магнитный носитель информации (дискета 3,5’’, 1,44Mb) с электронной версией пояснительной записки, полученным Windows-приложением (файл EcoInfo.exe), исходными текстами программы (файл EconomInfo.pas), а также другими необходимыми файлами для компиляции приложения.