Разработка формата хранения данных программ и решение задач

Цель: изучить возможности работы с файлами в языке Pascal. Получить навыки разработки формата хранения данных на примере решения задач аналитической геометрии. Освоить приемы структурирования программ.

Задание:

Задано множество точек. Найти параметры окружности минимального радиуса проходящей через три точки множества.

Изучить процедуры и функции языка Pascal для работы с файлами прямого и последовательного доступа.

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

Выходные данные вывести на экран и сохранить в текстовом файле.

При написании программы организовать контроль вводимых данных используя функцию IOResult();

Условие задачи с реквизитами исполнителя должны быть представлены на экране при запуске программы.

Структурировать программу с использованием процедур и функций.

Реализовать возможность ввода данных из файла и с клавиатуры.


1. Теоретическая часть:



Файл - именованная область внешней памяти ПК (жесткого диска, гибкой дискеты, электронного «виртуального» диска), либо логическое устройство – потенциальный источник или приемник информации.

Классификация файлов по типу доступа к элементам:

Файлы прямого доступа – это файлы, у которого в любой момент времени, возможно, получить элемент с указанным доступом:

А.Типизированные

F : file of <тип>;

F : file of point <точки>;

Б.Без типа

F : file;

2) Файлы последовательного доступа – это файлы у которых доступ к элементам осуществляется строго последовательно и отсутствует доступ по номеру элемента. (текстовые).

F : text;

В своей	 лабораторной работе я использовал файлы последовательного доступа. Следовательно, я использовал текстовые файлы, что обуславливает точность хранения данных программы. Для перевода  числа в строку используем Function IntToStr, для создания файла используем Procedure CrTFile, для считывания из файла используем Procedure ReDFile.



2. Описание блоков программы



Procedure titlist;  Tитульная страница.

Выводит на экран условия задачи с реквизитами исполнителя.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Function IntToStr; Перевод числа в строку.

Эта функция переводит число в строку.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure PROV; Проверка вводимых данных.

В этой процедуре происходит контроль вводимых данных при помощи Val ().

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure Osnova;  Расчёты программы

В этой процедуре происходят расчёты основной программы:

Проверка на равность отдельных отрезков исходящих из одной точки.

На существование возможных радиусов. И на существование наименьшего радиуса. Запись в текстовый файл Минимального радиуса.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure Klava;  Bвод входных данных с клавиатуры

Ввод входных данных с клавиатуры. Контроль вводимых данных при помощи процедуры Val ().  И в дальнейшем выполнение расчётов.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure ReDFile; Cоздание выходного файла

Считывание уже записанного файла, в который записываются координаты точек. Проверка на существование файла с помощью функции IOResult ().

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure CrTFile; Cоздание входного файла

Создание файла. Запись в этот файл координат точек.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure Menu; Предоставление пользователю варианта выбора дальнейшего действия программы.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Сама программа.



3. Обоснование выбора средств программной реализации блоков



Procedure titlist;                                                    Tитульная страница.

Выводит на экран условия задачи с реквизитами исполнителя.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Function IntToStr(V:integer):string;                   Перевод числа в строку.

V - число, которое переводим в строку – S..

V – параметрическая переменная.

String – тип возвращ. значения.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure PROV(Prigl:string; var V:integer; nz,vz:integer);   Проверка.

Prigl - приглашение, V - возращаемое число,

Nz - нижнее значение, vz - верхнее значение.

V – переменная, которая имеет непосредственную связь с самой программой.

Prigl - параметрическое заначение.

V – параметрическая переменная.

Nz, vz – параметрические заначения.

В этой процедуре происходит контроль вводимых данных при помощи Val ().

Если мы вводим буквы то, это строковые значения и выводится сообщение:

'ОШИБКА!!! Некорректные данные'.

Если мы вводим кол-во точек больше или меньше нужного выводится сообщение: 'ОШИБКА!!! Введенное число вне рамок диапазона'.

Если мы вводим координаты точек больше большего значения или меньше меньшего то выводиться сообщение: 'ОШИБКА!!! Число должно быть от Nz до Vz.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure Osnov(var m:integer;d:pnt);                            Расчёты программы.

M – параметрическая переменная.

D -  параметрическое значение.

В этой процедуре происходят расчёты основной программы:

Проверка на равность отдельных отрезков исходящих из одной точки.

На существование возможных радиусов. И на существование наименьшего радиуса. Запись в текстовый файл Минимального радиуса.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure Klava;                                    Bвод входных данных с клавиатуры.

Ввод входных данных с клавиатуры. Контроль вводимых данных при помощи процедуры Val ().  И в дальнейшем выполнение расчётов.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure ReDFile;                                           Cоздание выходного файла.

Считывание уже записанного файла, в который записываются координаты точек. Проверка на существование файла с помощью функции IOResult ().

Если файл существует производится выполнение расчётов. Если не существует, то появляется сообщение: 'О Ш И Б К А ! Файл не существует!'

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure CrTFile;                                                   Cоздание входного файла.

Создание файла. Запись в этот файл координат точек.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Procedure Menu;                                Выводит на экран меню программы.

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

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//

Выполнение самой программы.

Сама программа состоит из двух процедур: Titlist, Menu.

//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//



Листинг программы:



PROGRAM L_3;

Uses crt;

Type Point = Record               {zapis s koordinatami to4ek}

x : integer;                 {koordinatu X}

y : integer;                 {koordinatu Y}

END;

pnt = Array [1..20] Of Point; {koordinati to4ek}



{*************************** ************************************************}

{****************************************************************************}

procedure Titlist;

BEGIN

clrscr;

writeln('      Doneckiy gosudarstvennuy institut intelekta');

writeln;

writeln;

gotoxy(40,6);

write('Kafedra programnogo obespecheniy');

gotoxy(40,7);

writeln('    intellektualnuh sistem');

gotoxy(19,10);

writeln('     Laborotornay rabota #3');

writeln('          po kursu:"OP i AY"');

writeln('              po teme:"Razrabotka formatov hranenij dannih programmi.  "');

gotoxy(60,20);

write('Vupolnil:');

gotoxy(60,21);

write(');

gotoxy(60,22);

write();

writeln;

writeln;

writeln;

write('Nagmite lubuy klavishu');

readkey;

clrscr;

writeln('  Zadanie: Zadono mnogestvo tochek . Nayti parametru');

writeln('minimalnogo radiusa,prohodyshie cherez 3 tochki mnogestva.');

gotoxy(1,25);

write('Nagmite lubuy klavishu...');

readkey;

END;

{****************************************************************************}

{****************************************************************************}

function IntToStr(V:integer):string;

var S:string[11];

BEGIN

Str(V,S);

IntToStr:=S;

END;



{**************************** *********************************************}

procedure PROV(Prigl:string; var V:integer; nz,vz:integer);

{Prigl-priglawenie, V-vozrawaemoe 4islo,

nz-nignee zna4enie,vz-verhnee zna4enie}

Var S,S1:string[11];

Code:integer;

f:boolean;

BEGIN

repeat

write(Prigl);

f:=false;

readln(S);

val(S,V,Code);

if (Code)<>0 then

writeln(' OSHIBKA','NEKORECTNIE DANNUE')

else begin

str(V,S1);

if  S1 <> S then

writeln(' OSHIBKA','VVEDENNOE CHISLO VNE RAMKAH DEAPOZONA')

else

if ((V<nz) or (V>vz)) then begin

writeln(' OSHIBKA','CHISLO DOLGNO BUT OT '+InttoStr(nz)+' DO '+IntToStr(vz));

end

else f:=true;

end;



Until f;

END;

{****************************************************************************}

{****************************************************************************}

procedure Osnov(var m:integer;d:pnt);

Var out_f:text;                  {M-kolli4estvo to4ek, D-koordinati tochek}

FName:string[20];

i,k,l:integer;             {s4et4iki}

ki,kl,lk,li,ik,il:real;    {dlinu vektorov}

rad1,rad2,rad3:real;       {dlinu radiysov}

min:real;                  {Min. radiys}

BEGIN

ClrScr;

rad1:=0; rad2:=0; rad3:=0; min:=0;

for i:=1 to (m-2) do

BEGIN

textcolor(Green);

ik:=Sqrt(Sqr(D[i].x-D[k].x)+Sqr(D[i].y-D[k].y));

il:=Sqrt(Sqr(D[i].x-D[l].x)+Sqr(D[i].y-D[l].y));

if (il=ik) then

Begin

rad1:=ik;

writeln ( 'TOCHKA ',i,'- CENTR OKRYGNOSTI')

End

Else

writeln('TOCHKA ',i,' NE JAVLJETSJ CENTROM OKRYGNOSTI');

END;



for k:=i+1 to (m-1) do

BEGIN

textcolor(lightgray);

ki:=Sqrt(Sqr(D[i].x-D[k].x)+Sqr(D[i].y-D[k].y));

kl:=Sqrt(Sqr(D[l].x-D[k].x)+Sqr(D[l].y-D[k].y));

if (kl=ki) then

Begin

rad2:=ki;

writeln ( 'TOCHKA ',k,'- CENTR OKRYGNOSTI')

End

Else

writeln('TOCHKA ',k,' NE JAVLJETSJ CENTROM OKRYGNOSTI');

END;



for l:=k+1 to m do

BEGIN

textcolor(blue);

lk:=Sqrt(Sqr(D[k].x-D[l].x)+Sqr(D[k].y-D[l].y));

li:=Sqrt(Sqr(D[i].x-D[l].x)+Sqr(D[i].y-D[l].y));

if (lk=li) then

Begin

rad3:=lk;

writeln ( 'TOCHKA ',l,'- CENTR OKRYGNOSTI')

End

Else

writeln('TOCHKA ',l,' NE JAVLJETSJ CENTROM OKRYGNOSTI');



END;

writeln ('Nagmite lubyu klaviwy...');

readLn;



if rad1>0 then

BEGIN

textcolor(lightred);

min:=rad1;

writeln ('Min. radiys= ' ,min:4:2,' ¤«п в®зЄЁ' ,i,'');

if ((rad2>0) and (rad2<min)) then

Begin

min:=rad2;

writeln ('Min. radiys= ' ,min:4:2,' dlj tochki' ,k,'');

End;

if ((rad3>0) and (rad3<min)) then

Begin

min:=rad3;

writeln ('Min.radiys= ' ,min:4:2,' dlj tochki' ,l,'');

End

ELSE

if rad2>0 then

BEGIN

min:=rad2;

writeln ('Min.radiys= ' ,min:4:2,' dlj tochki' ,k,'');

if ((rad3>0) and (rad3<min)) then

Begin

min:=rad3;

writeln ('Min. radiys= ' ,min:4:2,' dlj tochki' ,l,'');

End

ELSE

if rad3>0 then

BEGIN

min:=rad3;

writeln ('Min. radiys= ' ,min:4:2,' dlju tochki' ,l,'');

END;



if min=0 then

writeln ('TOCHKA NE OBRAZUET RADIYS OKRYGNOSTI');

readkey;

End;

End;

TextColor(3);

TextBackground(0);

GoToXY(30,13);

WriteLn('Min. radiys=: ', min:4:2);

GoToXY(3,25);

NormVideo;

write('Dlj sohranenij nagmite ''ctrl+S'' ');

GoToXY(50,25);

write('Dlj prodolgenij nagmite ''Esc'' ');



if ReadKey=#19 then begin

clrscr;

write('Vvedite imj vihodnogo fajla: ');

readLn(FName);

Assign(out_f,FName);

Rewrite(out_f);

WriteLn(out_f,'Min. radiys= ',min);

Close(out_f);

writeln('Fajl yspewno sohranen');

readln;

end;



END;

{******************** *******************************************************}

{****************************************************************************}

procedure Klava;

Var

m:integer;    {kolli4estvo to4ek}

i:integer;    {s4et4ik}

d:pnt;        {koordinati to4ek}

BEGIN

clrscr;

PROV('Kolli4estvo to4ek M=',m,3,20);



for i:=1 to M do begin

writeLn('Vvedite koordinati ', i, '-j to4ki:');

PROV('.X = ', D[i].X,-99,99);

PROV('.Y = ', D[i].Y,-99,99);

end;

Osnova(m,d);

END;

{*********************** ****************************************************}

{****************************************************************************}

procedure ReDFile;

var in_f:file;

FName:string[20];

f:word;

m:integer;    {kolli4estvo to4ek}

i:integer;    {s4et4ik}

d:pnt;        {koordinati to4ek}

BEGIN

clrscr;

f:=0;

write('Vedite imj fajla: ');

readLn(FName);



Assign(in_f,FName);

{$I-}

Reset(in_f,2);

{$I+}

if IOResult=0 then

begin

blockread(in_f, m,1);

for i:=1 to m do begin

blockread(in_f, D[i].X,1);

blockread(in_f, D[i].Y,1);

end;

Close(in_f);

if f=0 then

Osnova(m,d);

end

else

begin

writeln('OSHIBKA','FAJL NE SYWESTVYET');

readln;

end;

END;

{*********************** ****************************************************}

{****************************************************************************}

procedure CrTFile;

var in_f: file;

FName:string[20];

m:integer;        {kolli4estvo to4ek}

i:integer;        {s4et4ik}

D:pnt;            {koordinati to4ek}

BEGIN

clrscr;

write('Vvedite imj fajla: ');

readLn(FName);

Assign(in_f,FName);

begin

clrscr;

Rewrite(in_f,2);



PROV('Vvedite kolli4estvo to4ek:',m,3,20);

BlockWrite(in_f,m,1);



for i:=1 to m do begin

writeLn('Vvedite koordinati ', i, '-j to4ki:');

PROV('.X = ', D[i].X,-99,99);

BlockWrite(in_f, D[i].X,1);

PROV('.Y = ', D[i].Y,-99,99);

BlockWrite(in_f, D[i].Y,1);

end;

ClrScr;

Close(in_f);

clrscr;

writeln('Fajl yspewno sozdan');

readln;

end;



END;

{****************************************************************************}

{****************************************************************************}

procedure Menu;

var

ch:char;

BEGIN

repeat

clrscr;

writeLn('4to vi hotite sdelat:');

writeLn('1: dlj voda vhodnih dannih s klaviatyru..');

writeLn('2: dlj s4ituvanij vhodnih dannih iz fajla..');

writeLn('3: dlj sozdanij vhodnogo fajla..');

writeLn(#10#13);

writeLn('0: dlj vihoda..');

repeat

ch:=ReadKey;

Until (ch='1') or (ch='2') or (ch='3') or (ch='0');

case ch of

'1': Klava;

'2': ReDFile;

'3': CrTFile;

end;

Until ch='0';

END;

{****************************************************************************}

{****************************************************************************}



BEGIN

Titlist;

Menu;

END.



5. Тестовые примеры



Входной файл:

Координаты 1-ой точки:

.X = 4

.Y = 6

Координаты 2-ой точки:

.X = 9

.Y = 0

Координаты 3-ей точки:

.X = 32

.Y = 6

Выходной файл:

Мин. радиус =: 7.21

Входной файл:

Координаты 1-ой точки:

.X = 10

.Y = 9

Координаты 2-ой точки:

.X = -34

.Y = -2

Координаты 3-ей точки:

.X = 3

.Y = 56

Координаты 4-ой точки:

.X = 1

.Y = 0

Выходной файл:

Мин. радиус =: 34.06