Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУКР ОПр.pdf
Скачиваний:
8
Добавлен:
11.02.2016
Размер:
972.13 Кб
Скачать

6

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

Ввод и редактирование значений исходных данных нужно производить в отдельном окне. Окно должно быть модальным.

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

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

Пример выполнения курсовой работы находится на дискете или на компьютерах в классе кафедры в папке «KPDemo OPr». Расположение папки с примером необходимо уточнить у преподавателя или системного администратора класса. При работе с примером его необходимо скопировать в рабочую папку студента и открывать из нее, это позволит предупредить случайную порчу примера.

2 Порядок выполнения курсовой работы.

2.1 Разработка расчетного модуля.

Создание описания данных.

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

type

TVect = record N : Integer;

Data : array of Double; end;

TMatr = record NI,NJ : Integer;

Data : array of array of Double; end;

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

Создание функций сохранения и чтения матрицы.

Данные функции должны отвечать следующим требованиям:

использовать общий формат хранения информации;

по возможности контролировать целостность информации.

7

Формат записи данных в файл принят следующий:

Тип файла – текстовый, это позволит контролировать содержание файла из других программ, например «Блокнота»;

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

Приведем пример реализации этих процедур:

procedure SaveMatrToFile(M: TMatr; Fn: string); var

SL: TStringList; I, J: Integer;

begin

SL := TStringList.Create; try

SL.Add(IntToStr(M.NI));

SL.Add(IntToStr(M.NJ)); for I := 0 to M.NI-1 do

for J := 0 to M.NJ-1 do SL.Add(FloatToStr(M.Data[I,J]));

SL.SaveToFile(Fn); finally

SL.Free; end;

end;//SaveMatrToFile

procedure LoadMatrFromFile(var M: TMatr; Fn: string); var

SL: TStringList;

I, J, K: Integer; begin

SL := TStringList.Create; try

SL.LoadFromFile(Fn); if SL.Count < 2 then

raise ELoadFile.Create('Файл поврежден'); try

M.NI := StrToInt(SL.Strings[0]);

M.NJ := StrToInt(SL.Strings[1]); if SL.Count <> M.NI*M.NJ+2 then

raise ELoadFile.Create('Файл поврежден'); SetLength(M.Data,M.NI,M.NJ);

K := 2;

for I := 0 to M.NI-1 do

for J := 0 to M.NJ-1 do begin

M.Data[I,J] := StrToFloat(SL.Strings[K]); inc(K);

end; except

on E:EConvertError do begin

raise ELoadFile.Create('Файл поврежден');

8

end; end;

finally

SL.Free; end;

end;//LoadMatrFromFile

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

Как видно в приведенном примере для сохранения и чтения матрицы используется класс TStringList, в котором инкапсулированы методы работы с текстовыми файлами.

Следует обратить внимание на способ обработки ошибок ввода вывода. Для передачи информации об ошибке использована технология генерирования ситуаций исключения. Для этого в разделе описания типов интерфейсной части модуля приведено описание нового исключения:

ELoadFile = class(Exception);

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

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

procedure AddMatrToList(SL : TStrings; M: TMatr; Sp:Char; StEn: Boolean);

var

I,J : Integer; St : string;

begin

for I := 0 to M.NI-1 do begin

St := '';

if StEn then St := Sp + ' ';

St := St + FloatToStrF(M.Data[I,0],ffFixed,8,3); for J := 1 to M.NJ-1 do

St := St + ' ' + Sp+ ' ' +FloatToStrF(M.Data[I,J],ffFixed,8,3);

if StEn then St := St + Sp; Sl.Add(St);

end;

end;//AddMatrToList

SL

В качестве параметров функция принимает:

: TStrings – список строк, в который будет помещена матрица;

M

: Tmatr

-

запись с матрицей;

Sp

: Char

-

символ разделитель между столбцами;

9

StEn: Boolean - признак надо ли ставить разделители снаружи таблицы.

Разработка расчетных процедур и функций.

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

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

В примере разбираются следующие задачи:

Нахождение среднего арифметического положительных элементов матрицы.

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

ENoPol = class(EMathError);

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

Формат заголовка функции и ее реализация приведены в следующем листинге:

function GetSrArPol(M: TMatr):Double; var

I, J, K : Integer; S : Double;

Begin

Result := 0; S := 0;

K := 0;

for I := 0 to M.NI-1 do for J := 0 to M.NJ-1 do

if M.Data[I,J]>0 then begin S := S + M.Data[I,J]; Inc(K);

end;

if K = 0 then

raise ENoPol.Create(’В матрице отсутствуют положительные’+ ’ элементы. ’);

Result := S/K; end;