регистрация / вход

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

Файл - именованная область внешней памяти ПК. Процедуры и функции языка Pascal для работы с файлами прямого и последовательного доступа. Классификация файлов по типу доступа к элементам. Обоснование выбора средств программной реализации блоков.

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

ОТКРЫТЬ САМ ДОКУМЕНТ В НОВОМ ОКНЕ

ДОБАВИТЬ КОММЕНТАРИЙ  [можно без регистрации]

Ваше имя:

Комментарий

Все материалы в разделе "Информатика и программирование"