Разработка и тестирование приложений
Сначала идёт проверка на непустой файл. Если текст непустой, то происходит обращение к функции «calc», если же текст пуст, то выдаётся сообщение об ошибке. Далее уже в функции «calc» вызывается функция «test», в которой происходит поиск и обработка ошибок. Затем выполняется само вычисление выражений (тех, которые записаны без ошибок) т. е. функция «calc» и вывод результатов в поле Memo2… Читать ещё >
Разработка и тестирование приложений (реферат, курсовая, диплом, контрольная)
Пояснительная записка к курсовой работе
Разработка и тестирование приложений
В курсовой работе ведется разработка приложения — калькулятор, а именно приложение будет вычислять простые выражения, записанные в постфиксной форме и сохранять результаты выражений в текстовом файле. Разработка будет произведена в среде программирования Delphi 2010. В ходе проверки разработанного приложения будет произведено тестирование двумя методами: «белого ящика» и «черного ящика».
1. Техническое задание
1.1 Основания для разработки программы
Основанием для разработки данного приложения является задание к курсовой работе по предмету «Методы программирования».
1.2 Назначение разработки.
«+», «-», «*», «/» и сохранения результатов в текстовом файле. Программа имеет возможность вычислять одновременно несколько выражений.
1.3 Требования к программе.
программа логический технический приложение
В программе организация входных данных осуществляется в виде текста из текстового файла, который загружается в многострочный редактор. Организация выходных данных осуществляется в виде выражений с результатами многострочном редакторе.
Время решения задачи обусловлено лишь количеством выражений, записанных в файл, соответственно, чем больше выражений требуется вычислить, тем дольше выполняется эта задача. В основном, так как форматируются небольшое количество выражений, то вычисление происходит довольно быстро.
Для работы программного изделия требуется персональный компьютер, обладающий следующими параметрами:
· объем ОЗУ не менее 32 Мб;
· объем жесткого диска не менее 900 Мб;
· микропроцессор (amd или intel) с тактовой частотой не менее 133 МГц;
· монитор с глубиной цвета 16 бит;
· ОС семейства windows (xp/vista/seven);
· Видеокарта amd или intel с тактовой частотой не менее 100 МГц и памятью 64Мб.
· Исходными должны быть математическими выражениями, записанными в постфиксной форме. (выражения должны содержать только знаки «+», «-», «*», «/», «=»).В каждой строке входного файла должно быть записано одно выражение.
Операнды и знаки операций должны быть разделены пробелами. Операнды должны быть целого беззнакового типа и принадлежать диапазону значений -0.65 535. Длина записи каждого выражения не должна превышать 255 символов, включая пробелы и знак «=».
1.4 Требования к надежности
В программе обеспечивается контроль загрузки текстового файла. Загрузке подлежит только текстовый файл с расширением.txt. Также идёт проверка многострочного редактора на наличие текста. В случае если поле многострочного редактора не заполнено, то при попытке форматирования текста будет выведено соответствующее сообщение об ошибке. Программа будет обрабатывать ошибки при любых, неверно загруженных исходных данных. Физические ошибки (такие как нехватка памяти на диске, битый файл и т. д.) не обрабатываются. Ошибки аппаратного уровня тоже не обрабатываются. Следует также учесть внешние факторы, которые могут повлиять на работу программы: это и механические повреждения носителя (диска), на котором хранится программа, и отказ оборудования, и перебои с электроэнергией, при которых программа завершится аварийно. Следует избегать этих случаев и ситуаций для корректной работы программы.
1.5 Требования к программной документации
Разработка программ ведется на основании следующих документов:
1. ГОСТ 19.001-77
Единая система программной документации. Общие положения
2. ГОСТ 19.101-77
Единая система программной документации. Виды программ и программных документов
3. ГОСТ 19.201-78
Единая система программной документации. Техническое задание. Требования к содержанию и оформлению
4. ГОСТ 19.202-78
Единая система программной документации. Спецификация. Требования к содержанию и оформлению
5. ГОСТ 19.301-79
Единая система программной документации. Программа и методика испытаний. Требования к содержанию и оформлению
6. ГОСТ 19.401-78
Единая система программной документации. Текст программы. Требования к содержанию и оформлению
7. ГОСТ 19.402-78
Единая система программной документации. Описание программы
8. ГОСТ 19.404-79
Единая система программной документации. Пояснительная записка. Требования к содержанию и оформлению
9. ГОСТ 19.503-79
Единая система программной документации. Руководство системного программиста. Требования к содержанию и оформлению
10. ГОСТ 19.504-79
Единая система программной документации. Руководство программиста. Требования к содержанию и оформлению
11. ГОСТ 19.505-79
Единая система программной документации. Руководство оператора. Требования к содержанию и оформлению
12. ГОСТ 19.701-90
Единая система программной документации. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения
1.6 Текст задания по варианту
В соответствии с поставленной задачей нужно разработать программу — калькулятор, которая должна вычислять результат выражения и помещать его в той же строке после знака «=». Порядок вычисления:
— если встретится операнд (число), то он должен запоминаться в стеке;
— если встретился знак операций («+»," -«, „*“,"/»), надо извлечь запоминаемые операнды и выполнить над ними эту операцию. Результат операции сохраняется в вершине стека
Метод решения
Для решения поставленной задачи нам необходимо иметь два текстовых файла. В первом будет содержаться исходные выражения. Второй будет содержать результаты выражений и ошибки.
Для выбора задания нужно предусмотреть меню, в котором пользователю представляются возможности вычислений. Меню должно содержать следующие пункты:
· Сохранение результатов;
· Загрузка выражений из файла.
Диалоговое окно пользователя должно предоставлять следующие возможности:
· Ввод выражений;
· Вывод результатов выражений и вывод ошибок.
В зависимости от правильности ввода данных, пользователю должно быть сообщено о правильности выполнения задачи. Если данные введены неверно, то должно быть выведено соответствующее сообщение об ошибке. Если данные введены верно, то программа выполнится.
Анализ требований и уточнений спецификаций
Для поставленной задачи можно использовать интерфейс с четырьмя состояниями:
1. Начальное состояние (Рисунок 2);
2. Состояние открытия файла (Рисунок 3);
3. Состояние вывода сообщения о пустом файле при открытии (Рисунок 4);
4. Состояние вывода результата (Рисунок 5).
Для всех состояний было разработано внешнее представление:
Рисунок 2. — Начальное состояние
Рисунок 3. — Открытие файла
Рисунок 4. — пустой файл
Рисунок 5. — Состояние вывода результата
Рисунок 6. — Объектная декомпозиция частей приложения
Рисунок 7. — Граф состояний интерфейса
2. Описание разработанной программы
2.1 Общие сведения
Наименование разработанной программы — «Калькулятор».
Для выполнения программы необходима ОS Windows XP/Vista/Seven.
Программа написана на языке программирования Delphi в среде разработки Embarcadero RAD Studio 2010.
2.2 Функциональное назначение
Программа предназначена для вычисления выражений, содержащих операции «+», «-», «*», «/» и записанных в постфиксной форме.
Иерархия классов
Иерархия взаимосвязи классов и объектов представлена на рисунке 8.
Рисунок 8. — Иерархия классов
Описание физической структуры Физическая структура программы «обработчик текста» представлена на рисунке 9. Здесь указано из каких подпрограмм и структур данных состоит данная программа, а также указаны связи по данным и управлению между ними.
Рисунок 9. — Физическая структура программы
2.3 Описание логической структуры
Окно формы в начале выполнения программы (рисунок 1):TMemo
Рисунок 1. — Окно формы в начале выполнения программы Следующие события происходят при разнообразных действиях с главным окном приложения:
· Событие 0: Щелчок по кнопке «Загрузить текст из файла». Обработчик этого события — процедура TForm1. Button4Click должна вывести окно открытия файла и предложить пользователю выбрать нужный текстовый файл для последующей его обработки в программе. Если текстовый файл пуст, то будет выведено сообщение об ошибке.
· Событие 1: Щелчок по кнопке «вычислить». Обработчик этого события — процедура TForm1. btnOperationClick, которая в свою очередь вызывает еще две основных процедуры test и calc. В них выполняется проверка на правильность выражений и само вычисление выражений, в результате чего результаты и ошибки выводятся в окне Memo2.
· Событие 2: Щелчок по кнопке «Сохранить». Обработчик этого события — процедура TForm1.btnSaveClick. Должна вывести окно сохранения файла и предложить пользователю выбрать нужный текстовый файл и сохранить в него полученные результаты и ошибки в текстовый файл.
Алгоритмы обработчиков событий для программы «Обработчик текста»
Событие 0
При успешном выполнении события загружается диалог открытия текстового файла. Выполнение обработчика события начинается с нажатия кнопки «Загрузить текст из файла».
Рис. 2
Описание алгоритма
После нажатия на кнопку «Загрузить текст из файла» открывается диалог выбора текстового файла для последующей работы с ним. Возможны 3 случая выполнения этого алгоритма: если текстовый файл не выбран, процедура заканчивается, а если выбран необходимый текстовый файл, то происходит проверка файла на наличие текста. Если файл не пуст, то происходит загрузка текста из этого файла в программу для последующей работы, иначе всплывает ошибка и процедура заканчивается.
Рисунок 2. — схема алгоритма обработчика события TForm1. btnOpenClick
Событие 1.
При успешном выполнении события происходит обработка возможных ошибок в выражениях и вычисление самих выражений. Это событие происходит при нажатии кнопки вычислить.
Рис. 3
Описание алгоритма
Сначала идёт проверка на непустой файл. Если текст непустой, то происходит обращение к функции «calc», если же текст пуст, то выдаётся сообщение об ошибке. Далее уже в функции «calc» вызывается функция «test», в которой происходит поиск и обработка ошибок. Затем выполняется само вычисление выражений (тех, которые записаны без ошибок) т. е. функция «calc» и вывод результатов в поле Memo2.
Процедура TForm1.btnOperationClick
Рисунок 3. — схема алгоритма TForm1. btnOperationClick
Функция calc
Выполняет вычисление выражения с использованием стека. Выражение разбирается слева направо. Каждый символ анализируется и в зависимости от того, является ли он цифрой, пробелом или знаком операции, выполняются соответствующие действия: занесение в стек, выполнение операций над операндами или переход к следующему символу.
Рисунок 4. — схема алгоритма «calc»
Функция test
Осуществляет проверку выражения на корректность. Выполняет проверку наличия недопустимых символов, и соответствие количества операндов количеству знаков операций и наличие и позицию символа «=».
Рисунок 5. — функция «test»
Событие 2
При успешном выполнении события происходит сохранение всех результатов текстовый файл. Выполнение обработчика события начинается с нажатия кнопки «Сохранить».
Рис. 4
Описание алгоритма
Сначала идёт проверка на наличие результата. Если текст пустой, то вывод сообщения об ошибке, если нет — в выбранный файл записывается результат.
Рисунок 8. — Блок-схема алгоритма TForm1. btnSaveClick
2.4 Используемые технические средства
При выполнении данной курсовой работы используется персональный компьютер с процессором AMD turion X2. Данный компьютер оснащен всеми устройствами необходимыми для работы в среде разработки Embarcadero RAD Studio 2010 и последующем запуске полученной программы.
2.5 Вызов и загрузка
Программа «Калькулятор» начинает свою работу при запуске приложения с именем «Project1.exe».
2.6 Входные данные
Для программы «Калькулятор» входными данными являются арифметические выражения введенные из текстового документа.
2.7 Выходные данные
В программе «Калькулятор» выходными данными будет являться те — же арифметические выражения, только с ответом после знака «=».
3. Программа и методика испытаний
3.1 Объект испытаний
Объектом испытаний является разработанное приложение: «Калькулятор».
3.2 Цель испытаний
Целью испытаний данных приложений является выяснение возможных ошибок во время выполнения программы, которые не были обнаружены на стадии разработки.
3.3 Требования к программе
Программы должны надежно работать и выполнять свои функции при любых возможных наборах исходных данных, выдавая результат за конечное время.
3.4 Требования к программной документации
Техническое задание — ГОСТ 19.201−78
Программа и методика испытаний — ГОСТ 19.301−79
Текст программы — ГОСТ 19.401−78
Описание программы — ГОСТ 19.402−78
3.5 Средства и порядок испытаний
Для проведения испытаний используется ноутбук с операционной системой семейства Windows 7. Испытания логической структуры будет производиться методом «белого ящика». Затем будет производиться испытание функциональных характеристик методом «черного ящика».
3.6 Методы испытаний
Метод «белого ящика»
Текст обработчика основного события С1 (функция calc):
begin
{1} i:=0;
{1} ts:=''; // обнуляем строку.
{1} ts:=test (s); //ts присваиваем значение функции test.
{2} if ts='' then // если длинна строки ts =0
{3} begin
{4} for C:= 1 to length (s) do // чтение строки посимвольно
{5} case s[c] of // если символ принадлежит
{6} '/': // знаку деления
{6} begin
{6} pop (a); // выталкиваем из стека 1 операнд
{6} pop (b); // выталкиваем из стека 2 операнд
{7} if b=0 then // если b=0 то
{8} begin
{8} ts:='ошибка! деление на 0!!!';
{8} calc:=ts; // значение функции calc присваиваем значение ts
{8} exit; // выход
{8} end
{9} else // иначе
{9} r:=a/b; // операнду r присваиваем значение a/b
{9} push®; /заносим в стек результат
{9} end;
{10} '*': // знаку умножения
{10} begin
{10} pop (a); // выталкиваем из стека 1 операнд
{10} pop (b); // выталкиваем из стека 2 операнд
{10} r:=a*b; //r присваиваем a*b
{10} push®; // заносим в стек результат
{10} end;
{11} '-': // знаку ;
{11} begin
{11} pop (a); // выталкиваем из стека 1 операнд
{11} pop (b); // выталкиваем из стека 2 операнд
{11} r:=a-b; // r присваиваем a-b
{11} push®; // заносим в стек результат
{11} end;
{12} '+': // знаку +
{12} begin
{12} pop (a); // выталкиваем из стека 1 операнд
{12} pop (b); // выталкиваем из стека 2 операнд
{12} r:=a+b; // r присваиваем a+b
{12} push®; // заносим в стек результат
{12} end;
{13} '0'.'9': // входит в множество от 0 до 9
{13} begin
{14} if (s [c1]=' ') or (c=1) then // если с1 элемент = пустому символу или с=1 то
{15} push (0); заносим в стек 0
{15} t:=ord (s[c]) — 48;
{15} pop (a); // извлечение операнда из стека
{15} a:=a*10+t; // умножение операнда на 10 и прибавление полученной // цифры
{15} push (a); занесение операнда в стек
{16} end;
{17} end;
{18} pop®; // выталкивание из стека результата
{18} str (r:0:3, ts); // преобразование операнда в буферную строку
{19} end;
{20} calc:=ts; // функции calc присваиваем значение ts
{21} end;
Каждой вершине потокового графа в процедуре соответствует оператор под тем же номером. Дуги графа соответствуют связям между операторами процедуры. Потоковый граф изображен на рисунке 14.
Рисунок 9. — Потоковый граф основного обработчика событий Цикломатическая сложность потокового графа:
1) V (G) = 23 дуги — 21 узел + 2 = 4;
2) V (G) = Число регионов =4;
3) V (G) = Число предикатных узлов3+1=4;
Базовое множество независимых линейных путей:
Путь 1: 1−2-3−4-21.
Путь 2: 1−2-3−4-5−6-7−8-19−20−4-21.
Путь 3: 1−2-3−4-5−13−14−15−16−17−18−19−20−4-21.
Путь 4: 1−2-3−4-5−6-7−9-10−11−12−17−18−19−20−4-21.
№ пути | Исходные данные | Ожидаемые результаты | Реальные результаты | |
Пустая строка | Вычислений не произойдет | Пустая строка. | ||
Деление на ноль | Будет выведена ошибка деления на 0. | ошибка! Деление на 0!!! | ||
Выражение, в котором установлен приоритет операций (10 1 + 5 6 + * =) | Должен вывести результат (10 1 + 5 6 + * =121.000) | (10 1 + 5 6 + * =121.000) | ||
Дано выражение вида: 10 2 3 7 21 / * + - = | Вычисление выражения с выводом 10 2 3 7 21 / * + - = 1 | 10 2 3 7 21 / * + - = 1 | ||
Метод «черного ящика»
Метод реализован совместным использованием способов разбиения на классы эквивалентности и тестирования граничных значений.
Предусловия:
1. Загружен текст.
Классы эквивалентности:
1. Файл пуст.
2. Файл содержит недопустимые символы.
3. Файл содержит допустимые символы.
Рисунок 14. — Структура дерева разбиений
№ листа | Исходные данные | Ожидаемые результаты | Реальные результаты | |
Загружен пустой файл. | Сообщение об ошибке. | Ошибка!!! Файл пуст. | ||
Загружен непустой текст. Файл не содержит недопустимые символы. | Программа может выполнить другие команды оператора. Содержимое файла отображается в окне. | Программа может выполнить другие команды оператора. Содержимое файла отображается в окне. | ||
Загружен непустой текст. Файл содержит недопустимые символы. | Сообщение об ошибке. | ошибка!!! В файле есть недопустимые символы | ||
4. Эксплуатационные документы
4.1 Руководство программиста
Общие сведения о программе
Программа «Калькулятор» должна считывать выражения из текстового файла, вычислять результаты этих выражений и записывать их в текстовый файл.
Структура программы
После запуска программы «Калькулятор» появится форма, на которой находятся поля редактирования текста. При нажатии на кнопку «загрузить текст из файла» открывается диалоговое окно открытие файла. При нажатии на кнопку «вычислить» вычисляются результатов выражений. При нажатии на кнопку «сохранить» выполняется соответствующая операция сохранения выражений с результатами.
Настройка программы
Для подготовки программы к своему выполнению, пользователь изначально должен записать арифметические выражения, которые ему необходимо вычислить. Далее нужно загрузить нужный текстовый файл в программу.
Проверка программы
Входные данные:
— текстовый файл, содержащий следующий текст;
— длина строки = 80;
Дополнительные возможности программы
Дополнительных возможностей программа не имеет. Она работает только в рамках поставленной задачи и не выходит за её рамки.
Сообщения системному программисту
1) Если текст не загружен, либо загружен пустой текст и нажата одна из следующий кнопок: «сохранить», «вычислить». Выводится сообщение об ошибке «отсутствует текст». Нужно нажать на «ОК» и загрузить текст.
Рисунок 18. — Сообщение об ошибке в результате пустого ввода.
4.2 Руководство пользователя
Назначение и условия применения программ.
Программа предназначена для вычисления простых арифметических выражений, а именно выражений, содержащих только знаки «+», «-», «/», «*». Для выполнения программы необходим IBM_совместимый персональный компьютер, оснащенный процессором AMD или аналогичным и операционной системой семейства Windows.
Обращение к программе для запуска
Для запуска программы необходимо запустить приложение с именем «Project1.exe».
Входные и выходные данные
Входными данными является текстовый файл с исходными выражениями. Выходными данными является текстовый файл с результатами.
Сообщения оператору
1) Если текст не загружен, либо загружен пустой текст и нажата одна из следующий кнопок: «сохранить», «вычислить». Выводится сообщение об ошибке «отсутствует текст». Нужно нажать на «ОК» и загрузить текст.
Рисунок 19. — Сообщение об ошибке в результате пустого ввода
1) Архангельский А. Я. Delphi 7. — ЗАО «Бином», 2004.
2) Пражский С. М. «Delphi. Учимся на примерах». — К.: «МК-Пресс». — 2005,-216 с.
3) Орлов С. Технологии разработки программного обеспечения. Спб.: Питер, 2002. — 464 с.: ил. (гл. 6, 7).
Приложение
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class (TForm)
Memo1: TMemo;
btnOpen: TButton;
Memo2: TMemo;
btnOperation: TButton;
btnSave: TButton;
OpenDialog1: TOpenDialog;
btnClose: TButton;
SaveDialog1: TSaveDialog;
Label1: TLabel;
Label2: TLabel;
procedure btnOpenClick (Sender: TObject);
procedure btnOperationClick (Sender: TObject);
procedure btnCloseClick (Sender: TObject);
procedure btnSaveClick (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
countSt:integer;
implementation
{$R *.dfm}
procedure TForm1. btnCloseClick (Sender: TObject);
begin
Close;
end;
procedure TForm1. btnOpenClick (Sender: TObject);
var
F: TextFile;
S: String;
i:integer;
begin
if OpenDialog1. Execute ()=true // Если файл выбран и нажато ОК
then
memo1. Lines. LoadFromFile (OpenDialog1. FileName);
if Length (memo1. Text) = 0 then
begin
ShowMessage ('ошибка!!! файл пуст.');
end
else
begin
for I:= 1 to Length (memo1. Text) do
// if memo1. Text[i] in ['a'.'z', 'A'.'Z', 'а'.'я', 'А'.'Я'] then
if not (memo1. Text[i] in ['0'.'9', ' ', '+', '-', '*', '/', '=',#13,#10]) then
begin
ShowMessage ('ошибка!!! В файле есть недопустимые символы');
memo1. Text:='';
exit;
end;
end;
end;
procedure TForm1. btnOperationClick (Sender: TObject);
type
pstck = ^tstck;
tstck = record
d:real;
next:pstck;
end;
var
inpp, outp: string;
h, p: pstck;
s:string;
i:integer;
procedure push (r:real);
begin
new (h);
h^.d:=r;
h^.next:=p;
p:=h;
end;
procedure pop (var r: real);
begin
r:=h^.d;
p:=h^.next;
dispose (h);
h:=p;
end;
function test (s:string):string;
var
i:byte;
cst:shortint;
ts:string;
begin
ts:='';
cst:=0;
for i:= 1 to length (s) do
begin
if (s[i] in ['0'.'9']) and not (s [i+1] in ['0'.'9']) then
cst:=cst+1;
if s[i] in ['+', '-', '*', '/'] then
begin
if cst<2 then
ts:=ts+#13+'Ошибка! Синтаксическая ошибка в выражении!';
cst:=cst1;
end;
if not (s[i] in ['0'.'9', ' ', '+', '-', '*', '/', '=']) then
ts:=ts+#13+'Ошибка! Символ «'+s[i]+'» недопустим в выражении!';
if (s[i]='=') and (i<>length (s)) then
ts:=ts+#13+'Ошибка! Знак «=» находится не в конце строки (выражения)!';
end;
if cst<1 then
ts:=ts+#13+'Ошибка! Знаков операций больше, чем операндов!';
if cst>1 then
ts:=ts+#13+'Ошибка! Операндов больше, чем знаков операций!';
if s [length (s)]<>'=' then
ts:=ts+#13+'Ошибка! Отсутствует «=» в конце строки (выражения)!';
test:=ts;
end;
function calc (s:string):string;
var
stck:pstck;
a, b, r: real;
t:word;
i, c: byte;
ts:string;
begin
i:=0;
ts:='';
ts:=test (s);
if ts='' then
begin
for C:= 1 to length (s) do
case s[c] of
'/':
begin
pop (a);
pop (b);
if b=0 then
begin
ts:='ошибка! деление на 0!!!';
calc:=ts;
exit;
end
else
r:=a/b;
push®;
end;
'*':
begin
pop (a);
pop (b);
r:=a*b;
push®;
end;
'-':
begin
pop (a);
pop (b);
r:=a-b;
push®;
end;
'+':
begin
pop (a);
pop (b);
r:=a+b;
push®;
end;
'0'.'9':
begin
if (s [c1]=' ') or (c=1) then
push (0);
t:=ord (s[c]) — 48;
pop (a);
a:=a*10+t;
push (a);
end;
end;
pop®;
str (r:0:3, ts);
end;
calc:=ts;
end;
begin
if Length (memo1. Text) = 0 then
begin
ShowMessage ('ошибка!!! исходные данные отсутствуют.');
exit;
end
else
countSt:=0;
i:=0;
Memo2. Lines. Text:=Memo1. Lines. Strings[countSt] + calc (Memo1. Lines. Strings[countSt]);
for i:= 0 to Length (Memo1. Lines. Text) do
if (Memo1. Lines. Text[i] = #10) then
begin
inc (countSt);
Memo2. Lines. Text:=Memo2. Lines. Text+#13+Memo1. Lines. Strings[countSt]+calc (Memo1. Lines. Strings[countSt]);
end;
end;
procedure TForm1. btnSaveClick (Sender: TObject);
var
s:string;
i:integer;
begin
if Length (memo1. Text) = 0 then
begin
ShowMessage ('ошибка!!! текст отсутствует.');
end
else
if SaveDialog1. Execute then begin
Memo2. Lines. SaveToFile (SaveDialog1. FileName);
программа логический технический приложение
end;
end;
end.