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