Разработка формата хранения данных программ и решение задач
Ввод входных данных с клавиатуры. Контроль вводимых данных при помощи процедуры Val (). И в дальнейшем выполнение расчётов. Если мы вводим кол-во точек больше или меньше нужного выводится сообщение: 'ОШИБКА!!! Введенное число вне рамок диапазона'. Файлы прямого доступа — это файлы, у которого в любой момент времени, возможно, получить элемент с указанным доступом: Согласно заданному варианту… Читать ещё >
Разработка формата хранения данных программ и решение задач (реферат, курсовая, диплом, контрольная)
Цель: изучить возможности работы с файлами в языке 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 L3;
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 ((Vvz)) 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
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