Реферат по предмету "Информатика, программирование"


Разработка форматов хранения данных программы. Структурирование

Лабораторнаяработа №2.
Разработкаформатов хранения данных программы. Структурирование.

Цель:1. Изучитьвозможность работы с файлами на языке Pascal. Получить навыки разработки формата хранения данных на примере решениязадач аналитической геометрии.
2. Освоить приёмыструктурирования программ.
Задание:
1.        Изучить процедурыи функции языка Pascal для работыс файлами прямого и последовательно доступа.
2.        Согласнозаданному варианту разработать формат и структуру в файлах прямого доступа.
3.        Реализоватьвозможность ввода данных с клавиатуры либо из файла.
4.        Выходные данныевывести на экран и сохранить в текстовый файл.
5.        При написаниипрограммы использовать контроль вводимых данных, используя функцию IOResult.
6.        Условие задачи среквизитами исполнителя должны быть предоставлены на экране при запускепрограммы.
7.        Структурироватьпрограмму с использованием процедур и функций.
Условие задачианалитической геометрии:
Найти количествоокружностей на плоскости имеющих пересечение с прямоугольником стороны которогопараллельны осям координат.

Содержание
1. Теоретическая часть
2. Алгоритм программы
3. Листинг программы
4. Экранные формы

1. Теоретическая часть
1. По методу доступа ккомпонентам файлы разделяются на последовательные и прямые. В последовательном файле  чтение  и  запись компонент может быть только последовательной, начиная спервой компоненты. В прямом файле можно прочесть или записать любую компоненту,указав ее номер в файле. При этом перебор предыдущих компонент не требуется. Понаправлению передачи данных файлы разделяются на входные и выходные.
Также существуют три типафайлов:
1) типизированные,компоненты которых имеют жесткую структуру;
2) текстовые, состоящиеиз символов и строк;
3) нетипизированные,рассматриваемые как последовательность байтов.
В Турбо-Паскале можнооткрыть файл только для чтения, только для записи, а также для чтения и записиодновременно. Для этого используются процедуры Reset, Rewrite, Append.
Reset(F) — открытие существующего файла. Еслиэто текстовый файл, то допускается только чтение из файла; для типизированногофайла допустимы как чтение, так и запись информации. В последнем случае можнолегко реализовать обновление компонент файла. Если файл F уже был открыт, топри выполнении процедуры Reset этот файл сначала закрывается, а затемоткрывается. При этом указатель файла устанавливается в начальную позициюфайла.
Rewrite(F) — открытие нового файла. Если это текстовыйфайл, то допускается только запись в файл; для типизированного файла допустимыкак чтение, так и запись информации. Если файл F уже существует, то присрабатывании процедуры Rewrite файл F уничтожается.
Append(F) — открытие текстового файла для добавленияновых компонент в конец файла. Если файл уже был открыт ранее с помощьюпроцедур Reset или Rewrite, то процедура Append вначалезакрывает данный файл, а затем его открывает для добавления новых компонент.
Существуют процедуры ифункции для файлов любого типа:
Процедура Close(F).Выполняется закрытие файла F. Если буфер вывода заполнен не полностью, то егосодержимое переносится в файл F, после чего из оперативной памяти удаляется служебнаяинформация о файле F.
Процедура Rename(F, newname). Внешнему файлу, связанному с файловой переменной F,присваивается новое имя, заданное в строке.
Процедура Erase(F).Файл F уничтожается. Процедура Erase применима только для закрытыхфайлов.
Функция Eof(F):boolean.Функция возвращает значение true, если достигнут конец файла; в противном случаевыходное значение равно false.
Функция IOResult:word (Input-Output-Result). Возвращает условный признак последней операции ввода-вывода.Результат равен нулю, если операция ввода-вывода завершилась успешно.
Процедура Truncate(F).Файл усекается по текущей позиции указателя. В эту позицию записывается признакeof.
Для выполнения операцийввода-вывода в текстовых файлах используются процедуры Read,Readln,Write,Writeln.
Также для текстовыхфайлов могут использоваться три предописанные функции, неприменимые для файловдругого типа: Eoln, SeekEoln и SeekEof.
Функция Eoln(F):booleanвозвращает значение true, если во входном потоке достигнут маркер конца строкиeol.
Функция SeekEoln(F):booleanпропускает все пробелы и знаки табуляции до маркера конца строки eol или допервого значащего символа и возвращает значение true, если такой маркеробнаружен.
Функция SeekEof(F):booleanпропускает все пробелы, знаки табуляции и маркеры конца строки вплоть домаркера конца файла eof или до первого значащего символа и возвращает значениеtrue, если такой маркер обнаружен.
Все компонентытипизированного файла, в отличие от текстового файла, имеют одну и ту же длину.Это позволяет программе определить местоположение любой компоненты файла по ееномеру и осуществить прямой доступ к этой компоненте. Компоненты типизированногофайла нумеруются натуральным рядом чисел 0,1,2,3,… При открытиитипизированного файла его указатель устанавливается на нулевую компоненту.После выполнения каждой операциичтения или записи указатель сдвигается наследующую компоненту.
Для операций чтения изаписи в типизированном файле используются процедуры Read и Write(но не Readln,Writeln).
Для типизированных файловопределены также предописанные процедура Seek и функции FileSize,FilePos.
Процедура Seek(F,k)перемещает указатель файла F на компоненту с номером k. Переменная k должнаиметь тип longint.
Функция FileSize(F):longintвозвращает текущий размер файла F (количество компонент файла).
Функция FilePos(F):longintвозвращает номер текущей позиции файла F.
Нетипизированные файлыприменяются главным образом для высокоскоростного обмена данными между диском ипамятью. Для этих файлов вместо процедур Read и Writeиспользуются процедуры BlockRead и BlockWrite.
2. Исходя из условиязадачи входные данные для программы:
а) Координаты точкицентра окружности;
b) Длина радиуса окружности;
c) Координаты левой верхней и нижнейправой точки прямоугольника, однозначно задающие его на плоскости.
Так как количество и типданных чётко определён в качестве файлов для ввода исходных данных будемиспользовать типизированные файлы, компоненты которых имеют жесткую структуру ик ним возможен прямой доступ.
Для хранения параметровокружности создадим типизированный файл circle.dat, который будет состоять измассива составных компонент имеющих три параметра: координаты x и y центраокружности и R — радиус окружности. Тип компоненты определим как запись, потомучто в записи можно объединить компоненты различных типов:
CircleType= record
x: integer;
y:integer;
R: word
end;
Координаты центраокружности x и y будут определены как целые числа, которые могут приниматьположительное и отрицательное значение, поэтому для них выбран тип integer.Радиус окружности R не может быть отрицательным для него выбран тип word — целое без знака, пределы изменения 0… 65535.
Таким образом массивокружностей будет описываться:
CircleAr:array[1..Nmax] of CircleType;
Описание файла:
CircleFile: fileofCircleType;
Для ввода параметровзадающих прямоугольник будем использовать типизированный файл rectangle.dat с двумя элементами типа запись:
RectangleType=record
x:integer;
y:integer;
end;
Таким образом каждый компонентфайла состоит из координат x и y угловых точек прямоугольника, массив точек прямоугольника ифайл будут описываться:
RectangleAr: array[1..2] of RectangleType;
RectangleFile: file of RectangleType;
3. В программереализована возможность ввода исходных данных из файла или клавиатуры. Послезапуска программы выдаётся запрос о направлении ввода “Откуда произвести вводисходных данных? f – файл, k-клавиатура”. В соответствии снажатой клавишей осуществляется переход к вводу данных.
4. Результаты выполненияпрограммы выводятся на экран и в текстовый файл result.txt,создаваемый в каталоге из которого запущена программа.
5. В программеосуществляется контроль вводимых данных:
При вводе числовогоответа с клавиатуры существует определенная вероятность ошибочного набора(например, буква вместо цифры). При вводе ответа с помощью оператора Read этовызвало бы прерывание программы и, как следствие, необходимость ее повторного запуска.Чтобы блокировать такое прерывание, ввод переменной производится с помощьюпроцедуры ReadInt, ReadWord в которыхпри помощи стандартной процедуры IOResult осуществляющей контроль формата вводимого числа. При неправильномформате ввода процедура ReadInt, ReadWord выдает на экран сообщение об ошибке и предлагает пользователю повторитьввод.
6. При запуске программына экране в первую очередь представлены условия задачи и реквизиты исполнителя,реализованные следующим участком кода:
ClrScr;
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
Writeln('▒     Лабораторная работа №2                   ▒');
Writeln('▒     студента гр. ▒');
Writeln('▒               ▒');
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
Writeln('▒  Условие задачи поаналитической геометрии:             ▒');
Writeln('▒  Найти количествоокружностей на плоскости             ▒');
Writeln('▒  имеющих пересечение спрямоугольником стороны  ▒');
Writeln('▒  которого параллельны осямкоординат.                       ▒');
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
8.        В программе используются следующие процедуры и функции, которыеструктурируют программу: FrazaReadError, ReadWord, ReadInt, PrintInData, Cross1,Cross2, PrintHead.
2. Листингпрограммы
Program Lab2;
uses Crt;
labelExitFromCalc;
ConstNmax=100;
Type
CircleType =record
x: integer;
y: integer;
R: word
end;
RectangleType=record
x: integer;
y: integer;
end;
Var
CircleAr       :       array[1..Nmax] of CircleType;
CircleFile     :       file of CircleType;
RectangleAr    :       array[1..2] of RectangleType;
RectangleFile  :       file of RectangleType;
ResultFile     :       text;
n: word;    {Кол-воокружностей для проверки}
i: byte;       {параметрцикла}
S: byte;       {счётчикпересечений окружностей с прямоугольником}
ch: char;
size:longint;
{------------------------------------------------------------ }
ProcedureFrazaReadError(k:integer);
{ Сообщение онеправильном формате вводимого числа с подачей }
{ звуковогосигнала                                          }
Begin
If k0then
Begin
Writeln(#7'Неправильный форматчисла');
Writeln('Повторите ввод');
End;
End { FrazaReadError };
{------------------------------------------------------------ }
ProcedureReadWord(Var Number:word);
{ Ввод с клавиатуры ипроверка формата переменной типа word}
Var  k: word;
Begin
Repeat
{$I-}Read(Number); {$I+}
k:=IOResult;
FrazaReadError(k);
Until k=0;
End { ReadWord};
{------------------------------------------------------------ }
ProcedureReadInt(Var Number:integer);
{ Ввод с клавиатуры ипроверка формата переменной типа integer }
Var  k:integer;
Begin
Repeat
{$I-}Read(Number); {$I+}
k:=IOResult;
FrazaReadError(k);
Until k=0;
End { ReadInt};
{------------------------------------------------------------ }
ProcedurePrintInData;
Var i: byte;
Begin
Writeln('          Исходные данные');
Writeln('Окружности:');
For i:=1 to ndo
Begin
Write(i,':','R=',CircleAr[i].R,'(',CircleAr[i].x,':',CircleAr[i].x,')','; ');
End;
Writeln;
Writeln('Прямоугольник:');
Writeln('Верхняя правая точка:(',RectangleAr[1].x,':',RectangleAr[1].y,')');
Writeln('Верхняя правая точка:(',RectangleAr[2].x,':',RectangleAr[2].y,')');
End{PrintInData};
{------------------------------------------------------------ }
FunctionCross1(Var R:word; P,C:integer):boolean;
Begin
Cross1:=false;
if(R*R-(P-C*C))>=0 then Cross1:=true;
End {Cross1};
{------------------------------------------------------------ }
FunctionCross2(Var Inter1,Inter2:integer; R:word; P,C1,C2:integer):boolean;
Var Buf:real;
Begin
Cross2:=false;
Buf:=sqrt(R*R-(P-C1*C1))+C2;
ifBuf
ifBuf>=Inter1 then Cross2:=true;
End {Cross2};
{------------------------------------------------------------ }
ProcedurePrintHead;
Begin
ClrScr;
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
Writeln('▒         Лабораторная работа №2                 ▒');
Writeln('▒         студента гр▒');
Writeln('▒              ▒');
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
Writeln('▒  Условиезадачи по аналитической геометрии:     ▒');
Writeln('▒  Найтиколичество окружностей на плоскости      ▒');
Writeln('▒  имеющихпересечение с прямоугольником стороны  ▒');
Writeln('▒ которого параллельны осям координат.           ▒');
Writeln('▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒');
End { ReadInt };
{------------------------------------------------------------ }
Begin
PrintHead;
Writeln('Откудапроизвести ввод исходных данных?');
Writeln('f — файл,k-клавиатура');
Repeat
ch:=ReadKey;
Until((ch='k') or (ch='f'));
if (ch='k')then
Begin
Writeln('Набор параметров завершайтенажатием клавиши Enter');
Write('Введите количествоокружностей:'); ReadWord(n);
For i:=1 to ndo
Begin
Writeln('Введитекординаты центра ',i,' окружности.');
Write('x=');ReadInt(CircleAr[i].x);
Write('y=');ReadInt(CircleAr[i].y);
Writeln('Введите радиус',i,' окружности.');
Write('R=');ReadWord(CircleAr[i].R);
End;
For i:=1 to 2do
Begin
Writeln('Введитекординаты ',i,' точки прямоугольника');
Write('x=');ReadInt(RectangleAr[i].x);
Write('y=');ReadInt(RectangleAr[i].y);
End;
PrintHead;
PrintInData;
Writeln('Записатьвведённые данные в файлы входных данных?');
Writeln('(y — Да, n — Нет)');
Repeat
ch:=ReadKey;
Until((ch='y') or (ch='n'));
if (ch='y')then
Begin
Assign(CircleFile,'circle.dat');Rewrite(CircleFile);
Assign(RectangleFile,'rectangl.dat');Rewrite(RectangleFile);
For i:=1 to ndo
Write(CircleFile,CircleAr[i]);
size:=FileSize(CircleFile);
Writeln('Файл circle.dat перезаписан!!! Текущий размер ',size,' компонент.');
For i:=1 to 2do
Write(RectangleFile,RectangleAr[i]);
Writeln('Файл rectangle.dat перезаписан!!!');
Close(RectangleFile);Close(CircleFile);
End;
End
else
Begin
Assign(CircleFile,'circle.dat');Reset(CircleFile);
Assign(RectangleFile,'rectangl.dat');Reset(RectangleFile);
size:=FileSize(CircleFile);
n:=size;
For i:=1 to ndo
Read(CircleFile,CircleAr[i]);
For i:=1 to 2do
Read(RectangleFile,RectangleAr[i]);
Close(RectangleFile);Close(CircleFile);
Writeln('Данные из входных файлов загружены!!!');
PrintInData;
End;
S:=0;
{Цикл проверки}
For i:=1 to ndo
Begin
ifCross1(CircleAr[i].R,RectangleAr[1].y,CircleAr[i].y) then
Begin
ifCross2(RectangleAr[1].x,RectangleAr[2].x,CircleAr[i].R,RectangleAr[1].y,CircleAr[i].y,CircleAr[i].x)then
Begin
S:=S+1; GoToExitFromCalc;
End
End;
ifCross1(CircleAr[i].R,RectangleAr[2].y,CircleAr[i].y) then
Begin
ifCross2(RectangleAr[1].x,RectangleAr[2].x,CircleAr[i].R,RectangleAr[2].y,CircleAr[i].y,CircleAr[i].x)then
Begin
S:=S+1; GoToExitFromCalc;
End
End;
ifCross1(CircleAr[i].R,RectangleAr[1].x,CircleAr[i].x) then
Begin
ifCross2(RectangleAr[1].y,RectangleAr[2].y,CircleAr[i].R,RectangleAr[1].x,CircleAr[i].x,CircleAr[i].y)then
Begin
S:=S+1; GoToExitFromCalc;
End
End;
ifCross1(CircleAr[i].R,RectangleAr[2].x,CircleAr[i].x) then
Begin
ifCross2(RectangleAr[1].y,RectangleAr[2].y,CircleAr[i].R,RectangleAr[2].x,CircleAr[i].x,CircleAr[i].y)then
Begin
S:=S+1; GoToExitFromCalc;
End
End;
ExitFromCalc:
End;
{Конец цикла проверки}
Writeln('Спрямоугольником пересекаются ',S,' окружности(ей) из ',n,'.');
Assign(ResultFile,'result.txt');
Rewrite(ResultFile);
Write(ResultFile,'Спрямоугольником пересекаются ',S,' окружности(ей) из ',n,'.');
Close(ResultFile);
Readln;
End.

4. Экранные формы:
 
/>


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

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

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.