Цель: изучить возможности
работы с файлами в языке 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
Контрольная работа | Концепция информатизации Российской Федерации |
Контрольная работа | Причины агрессивного поведения. Методы работы с агрессивными детьми |
Контрольная работа | Алгоритм выбора и реализации предпринимательской идеи |
Контрольная работа | Системы управления взаимоотношения с клиентами |
Контрольная работа | Учет материальных затрат в бухгалтерском учете |
Контрольная работа | Геополитическое положение России |
Контрольная работа | Особенности вознаграждения работников в организации |
Контрольная работа | Виды запасов |
Контрольная работа | Психоанализ |
Контрольная работа | Экономико-географическая характеристика Печорского угольного бассейна 2 |
Контрольная работа | Структура АПК России. Проблемы его развития в условиях рыночных отношений |
Контрольная работа | Финансово-экономический контроль Центрального банка Российской Федерации |
Контрольная работа | Формы бухгалтерского учета и учетные регистры |
Контрольная работа | Методы расчета производительности труда |
Контрольная работа | Изучение приспособленности организмов к среде обитания |