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

Цель: изучить возможностиработы с файлами в языке Pascal. Получить навыки разработки формата храненияданных на примере решения задач аналитической геометрии. Освоить приемыструктурирования программ.
Задание:
Задано множество точек.Найти параметры окружности минимального радиуса проходящей через три точкимножества.
Изучить процедуры ифункции языка Pascal для работы с файлами прямого и последовательного доступа.
Согласно заданному варианту,разработать формат и структуру файла прямого доступа для хранения входныхданных.
Выходные данные вывестина экран и сохранить в текстовом файле.
При написании программыорганизовать контроль вводимых данных используя функцию IOResult();
Условие задачи среквизитами исполнителя должны быть представлены на экране при запускепрограммы.
Структурировать программус использованием процедур и функций.
Реализовать возможностьввода данных из файла и с клавиатуры.

1. Теоретическаячасть:
Файл — именованнаяобласть внешней памяти ПК (жесткого диска, гибкой дискеты, электронного«виртуального» диска), либо логическое устройство – потенциальный источник илиприемник информации.
Классификация файлов потипу доступа к элементам:
Файлы прямого доступа –это файлы, у которого в любой момент времени, возможно, получить элемент суказанным доступом:
А.Типизированные
F: file of ;
F: file ofpoint ;
Б.Без типа
F: file;
2) Файлыпоследовательного доступа – это файлы у которых доступ к элементам осуществляетсястрого последовательно и отсутствует доступ по номеру элемента. (текстовые).
F: text;
В своей      лабораторной работе я использовал файлы последовательного доступа.Следовательно, я использовал текстовые файлы, что обуславливает точностьхранения данных программы. Для перевода  числа в строку используем FunctionIntToStr, для создания файла используем 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итульнаястраница.
Выводит на экран условиязадачи с реквизитами исполнителя.
//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//
FunctionIntToStr(V:integer):string;                   Перевод числа в строку.
V — число, котороепереводим в строку – S..
V – параметрическаяпеременная.
String – тип возвращ.значения.
//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//
ProcedurePROV(Prigl:string; var V:integer; nz,vz:integer);   Проверка.
Prigl — приглашение, V — возращаемое число,
Nz — нижнее значение, vz- верхнее значение.
V – переменная, котораяимеет непосредственную связь с самой программой.
Prigl — параметрическоезаначение.
V – параметрическаяпеременная.
Nz, vz – параметрическиезаначения.
В этой процедурепроисходит контроль вводимых данных при помощи Val ().
Если мы вводим буквы то,это строковые значения и выводится сообщение:
‘ОШИБКА!!! Некорректныеданные’.
Если мы вводим кол-воточек больше или меньше нужного выводится сообщение: ‘ОШИБКА!!! Введенное числовне рамок диапазона’.
Если мы вводим координатыточек больше большего значения или меньше меньшего то выводиться сообщение:’ОШИБКА!!! Число должно быть от Nz до Vz.
//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//
ProcedureOsnov(var m:integer;d:pnt);                            Расчёты программы.
M – параметрическаяпеременная.
D –  параметрическоезначение.
В этой процедурепроисходят расчёты основной программы:
Проверка на равностьотдельных отрезков исходящих из одной точки.
На существованиевозможных радиусов. И на существование наименьшего радиуса. Запись в текстовыйфайл Минимального радиуса.
//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//
ProcedureKlava;                                    Bвод входных данных с клавиатуры.
Ввод входных данных с клавиатуры.Контроль вводимых данных при помощи процедуры Val ().  И в дальнейшемвыполнение расчётов.
//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//
ProcedureReDFile;                                           Cоздание выходного файла.
Считывание ужезаписанного файла, в который записываются координаты точек. Проверка насуществование файла с помощью функции IOResult ().
Если файл существуетпроизводится выполнение расчётов. Если не существует, то появляется сообщение:’О Ш И Б К А! Файл не существует!’
//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//
ProcedureCrTFile;                                                   Cоздание входногофайла.
Создание файла. Запись вэтот файл координат точек.
//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//
ProcedureMenu;                                Выводит на экран меню программы.
Данная процедура выводитна экран меню программы, руководствуясь которым мы можем выполнять различныедальнейшие действия.
//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//–//
Выполнение самойпрограммы.
Сама программа состоит издвух процедур: 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}
{***************************************************************************}
{****************************************************************************}
procedureTitlist;
BEGIN
clrscr;
writeln(‘     Doneckiy gosudarstvennuy institut intelekta’);
writeln;
writeln;
gotoxy(40,6);
write(‘Kafedraprogramnogo 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(‘Nagmitelubuy klavishu’);
readkey;
clrscr;
writeln(‘ Zadanie: Zadono mnogestvo tochek. Nayti parametru’);
writeln(‘minimalnogoradiusa,prohodyshie cherez 3 tochki mnogestva.’);
gotoxy(1,25);
write(‘Nagmitelubuy klavishu…’);
readkey;
END;
{****************************************************************************}
{****************************************************************************}
functionIntToStr(V:integer):string;
varS: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-nigneezna4enie,vz-verhnee zna4enie}
VarS,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 ((Vvz)) then begin
writeln(‘OSHIBKA’,’CHISLO DOLGNO BUT OT ‘+InttoStr(nz)+’ DO ‘+IntToStr(vz));
end
else f:=true;
end;
Until f;
END;
{****************************************************************************}
{****************************************************************************}
procedureOsnov(var m:integer;d:pnt);
Varout_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 tom 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>0then
BEGIN
textcolor(lightred);
min:=rad1;
writeln (‘Min.radiys= ‘ ,min:4:2,’ ¤«п в®зЄЁ’ ,i,”);
if((rad2>0) and (rad2
Begin
min:=rad2;
writeln (‘Min.radiys= ‘ ,min:4:2,’ dlj tochki’ ,k,”);
End;
if((rad3>0) and (rad3
Begin
min:=rad3;
writeln(‘Min.radiys= ‘ ,min:4:2,’ dlj tochki’ ,l,”);
End
ELSE
if rad2>0then
BEGIN
min:=rad2;
writeln(‘Min.radiys= ‘ ,min:4:2,’ dlj tochki’ ,k,”);
if((rad3>0) and (rad3
Begin
min:=rad3;
writeln (‘Min.radiys= ‘ ,min:4:2,’ dlj tochki’ ,l,”);
End
ELSE
if rad3>0then
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(‘Dljsohranenij nagmite ”ctrl+S” ‘);
GoToXY(50,25);
write(‘Dljprodolgenij nagmite ”Esc” ‘);
if ReadKey=#19then begin
clrscr;
write(‘Vvediteimj vihodnogo fajla: ‘);
readLn(FName);
Assign(out_f,FName);
Rewrite(out_f);
WriteLn(out_f,’Min.radiys= ‘,min);
Close(out_f);
writeln(‘Fajlyspewno sohranen’);
readln;
end;
END;
{***************************************************************************}
{****************************************************************************}
procedureKlava;
Var
m:integer;   {kolli4estvo to4ek}
i:integer;   {s4et4ik}
d:pnt;       {koordinati to4ek}
BEGIN
clrscr;
PROV(‘Kolli4estvoto4ek M=’,m,3,20);
for i:=1 to Mdo begin
writeLn(‘Vveditekoordinati ‘, i, ‘-j to4ki:’);
PROV(‘.X = ‘,D[i].X,-99,99);
PROV(‘.Y = ‘,D[i].Y,-99,99);
end;
Osnova(m,d);
END;
{***************************************************************************}
{****************************************************************************}
procedureReDFile;
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(‘Vediteimj fajla: ‘);
readLn(FName);
Assign(in_f,FName);
{$I-}
Reset(in_f,2);
{$I+}
if IOResult=0then
begin
blockread(in_f,m,1);
for i:=1 to mdo 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’,’FAJLNE SYWESTVYET’);
readln;
end;
END;
{***************************************************************************}
{****************************************************************************}
procedureCrTFile;
var in_f:file;
FName:string[20];
m:integer;       {kolli4estvo to4ek}
i:integer;       {s4et4ik}
D:pnt;           {koordinati to4ek}
BEGIN
clrscr;
write(‘Vvediteimj fajla: ‘);
readLn(FName);
Assign(in_f,FName);
begin
clrscr;
Rewrite(in_f,2);
PROV(‘Vveditekolli4estvo to4ek:’,m,3,20);
BlockWrite(in_f,m,1);
for i:=1 to mdo begin
writeLn(‘Vveditekoordinati ‘, 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(‘Fajlyspewno sozdan’);
readln;
end;
END;
{****************************************************************************}
{****************************************************************************}
procedureMenu;
var
ch:char;
BEGIN
repeat
clrscr;
writeLn(‘4tovi 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