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

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


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