Цель: изучить возможности работы с файлами в языке 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
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 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>0
then 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>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