Контрольная работа по предмету "Информатика, программирование"


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

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



Не сдавайте скачаную работу преподавателю!
Данную контрольную работу Вы можете использовать для выполнения своих заданий.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :