Реферат: Программирование на языке Турбо Паскаль
Пример 1 (процедуры чтения). Пусть имеется текстовый файл, например программа на Паскале. Требуется распечатать его содержимое на экране:
program ShowFile;
var f: text;
c: char;
begin
assign(f,'showfile.pas');
reset(f);
while not eof(f) do begin
while not eoln(f) do begin read(f,c); write(c); end;
readln(f);
writeln;
end;
close(f);
readln;
end.
3. Запись данных в файл
А теперь перейдём к процедурам записи в файл. Перед тем как что-либо записывать, нужно создать новый (пустой) файл или стереть содержимое существующего. Для этого используется процедура
rewrite(TxtFile: text);
До её вызова файловая должна быть привязана к имени файла на диске с помощью assign. Если файл не существовал, то rewrite создаст его, если существовал, то содержимое будет стёрто. В любом случае файл будет пустым, а указатель записи стоит на начале файла.
Для записи используются процедуры
write(TxtFile: text, p1: type1, p2: type2, ... pN: typeN);
writeln(TxtFile: text, p1: type1, p2: type2, ... pN: typeN);
Здесь в качестве параметров p1, p2, ... pN можно использовать не только переменные, но и выражения: числовых типов, строковые, символьные и логические (boolean). В отличие от write, writeln после записи в файл значений p1, p2, ... pN переводит указатель записи на начало новой строки; writeln с одним параметром (текстовый файл) лишь переводит указатель на новую строку.
Так же как и в случае с чтением из файла, после того как все данные записаны файл нужно закрыть с помощью close.
Пример 2 (запись в файл). Пусть дан произвольный текстовый файл, требуется получить другой файл, в каждой строке которого записана длина соответствующей строки исходного файла:
program WriteLength;
var f1,f2: text;
s: string;
begin
assign(f1,'writelen.pas'); reset(f1);
assign(f2,'result.txt'); rewrite(f2);
while not eof(f1) do begin
readln(f1,s);
writeln(f2,length(s));
end;
close(f1); close(f2);
end.
Ещё один способ записи — это открытие для добавления информации в конец файла. Для этого используется процедура
append(TxtFile: text);
Если файл открыт с помощью append, то всё его содержимое сохраняется. При завершении дописывания в конец файла его также следует закрыть с помощью close.
Лекция 13. Двоичные файлы
Двоичный файл представляет собой последовательность одинаковых элементов, записанных на диске. В отличие от текстовых файлов, в двоичных нет разбиения на строки, файл напоминает массив, с той лишь разницей, что доступ к элементам может быть только последовательным. Для того, чтобы определить, достигнут ли конец файла, по-прежнему используется функция eof. Функция eoln, очевидно, здесь неприменима.
Для всех обсуждаемых ниже файлов можно выполнять те же процедуры открытия, закрытия и привязки, что и для текстовых: Append, Assign, Close, Reset, Rewrite. Кроме того, появляется процедура Truncate(var f: file), которая уничтожает всё содержимое файла, находящееся после текущего указателя чтения.
Двоичные файлы будем делить на типизированные и нетипизированные.
1. Типизированные файлы
Файлы этого вида состоят из элементов одинакового типа, то есть в них нельзя записывать (или читать) значения переменных разных типов, в отличие от текстовых файлов.
Объявляются типизированные файлы так:
var f: file of тип_элемента;
В качестве типа элемента можно использовать как простые типы, так и структурированные (массивы, записи и т.п.).
2. Нетипизированные файлы
Нетипизированный файл, в отличие от типизированного, используется для хранения разнородной информации, а не одинаковых элементов. В него можно записывать (а также читать) значения переменных практически любого типа (простых типов, массивов, записей, и т. п.). Описываются переменные, соответствующие нетипизированным файлам, следующим образом:
var f: file;
Для чтения и записи процедуры read и write не подходят. Используются такие процедуры:
1. BlockRead(var f: file; var buf; count: word [; var result: word]); – читает в переменную Buf count записей из файла, переменная result показывает сколько записей было скопировано в действительности. Под записью понимается «кусок» файла в несколько байт, размер записи можно установить при открытии файла, например: reset(f,1).
2. BlockWrite(var f: file; var buf; count: word [; var result: word]); – записывает указанное количество записей в файл. Если для открытия используется rewrite, то во втором её параметре также можно указать размер записи.
Лекция 14. Модули в Турбо Паскале
В Турбо Паскале допускается разбивать программы на части и хранить эти части в отдельных файлах на диске. Кроме основной программы появляются так называемые модули, которые предоставляют основной программе или другим модулям свои переменные, константы, типы, процедуры, функции и т. п. Чтобы использовать модуль в программе, нужно указать его имя после uses.
При написании модуля сначала описывается то, что он предоставляет для общего пользования (секция интерфейса), а затем – как он устроен (секция реализации). Иногда существует секция инициализации, где записаны действия, которые выполняются при подключении этого модуля. Записывается это всё следующим образом:
unit MyUnit;
interface
(*Интерфейсная секция*)
uses ...;
const ...;
type ...;
procedure ...; {Только
function ...; заголовки}
implementation
(*Секция реализации*)
uses ...;
const ...;
type ...;
procedure ...; {Реализация всех описанных
begin процедур и функций}
...
end;
function ...;
begin
...
end;
[begin]
(*Секция инициализации*)
end.
Рассмотрим части модуля подробнее. Uses в интерфейсной секции может быть нужен, если в ней используются какие-либо ресурсы из других модулей. Процедуры и функции здесь только описываются, но не реализуются, то есть не записываются тела процедур и функций (begin ... end;). В секции реализации можно также подключать другие модули; создавать переменные, константы, типы, процедуры и функции, которые «видны» только внутри этого модуля, никакой другой модуль или программа на может ими пользоваться. Здесь же обязательно должны быть записаны все процедуры и функции (полностью). Параметры (в скобках) после имени процедуры и функции в секции реализации можно не указывать.
Секция инициализации содержит те действия, которые должны выполняться когда наш модуль подключается к программе, то есть до того как начнёт работать сама программа. Модуль graph, например устанавливает в секции инициализации значения по умолчанию цвета линий и фона, стиль линий, стиль заливки т.п.
При сохранении модуля ему нужно дать такое же имя, как и после unit в тексте модуля. Имена файлов, содержащих модули, должны иметь расширение «pas», также как и программы.
Рассмотрим пример. Наш модуль предназначается для операций с трехмерными векторами:
unit Vectors;
interface
type tVec3D = record
x,y,z: real;
end;
procedure VecAdd(a,b: tVec3D; var c: tVec3D);
procedure VecSub(a,b: tVec3D; var c: tVec3D);
procedure VecMultNum(k: real; a: tVec3D; var b: tVec3D);
function ScalarProduct(a,b: tVec3D): real;
implementation
procedure VecAdd(a,b: tVec3D; var c: tVec3D);
begin
c.x:=a.x+b.x;
c.y:=a.y+b.y;
c.z:=a.z+b.z;
end;
procedure VecSub(a,b: tVec3D; var c: tVec3D);
begin
c.x:=a.x-b.x;
c.y:=a.y-b.y;
c.z:=a.z-b.z;
end;
procedure VecMultNum(k: real; a: tVec3D; var b: tVec3D);
begin
b.x:=k*a.x;
b.y:=k*a.y;
b.z:=k*a.z;
end;
function ScalarProduct(a,b: tVec3D): real;
begin
ScalarProduct:=a.x*b.x+a.y*b.y+a.z*b.z;
end;
end.
В программе наш модуль можно использовать, например, так:
program xxx;
uses Vectors;
var v1,v2,res: tVec3D;
...
begin
...
VecMultNum(0.2,v1,res);
VecSub(v2,res,res);
{в результате res = v2-0.2×v1}
...
end.
В случаях, когда несколько модулей содержат объекты с одинаковыми именами, обращаться к ним нужно с указанием имени модуля: <имя модуля>.<имя объекта> . Пусть, например, модули unit1 и unit2 содержат процедуры с одинаковыми именами proc1, тогда обращаться к ним следует так: unit1.proc1; и unit2.proc2; .
Преимущества модулей:
1. Средства, взятые из модулей позволяют не повторять в программах одни и те же фрагменты.
2. Переменные, процедуры и другие объекты можно скрыть в секции реализации, если их необдуманное выполнение может испортить программу.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12