Отправляет email-рассылки с помощью сервиса Sendsay

Pascal с нуля by [CPM]

  Все выпуски  

Pascal с нуля by [CPM] Выпуск №16


Информационный Канал Subscribe.Ru

[Ø] Рассылка "Pascal с нуля" by [CPM]. Выпуск №16 [Ø]

::[Ø]BEGIN[Ø]::

Автор: FreeMan[CPM] mailto: vovanc@bigmir.net

Дизайн:Ustas [CPM]  mailto: ustas1715@yandex.ru

Помогает: MedL[CPM] mailto: medlmail@bigmir.net

Editorial

Доброе время суток, уважаемые подписчики.

Наконец пришло время представить вам очередной выпуск нашей рассылки.
Небольшие редакционные новости:
MedL решил больше не писать, а точнее писать мало, так как считает, что его уровень знаний Паскаля ниже того, который необходим для ведения рассылки.
Его собственные комментарии по этому поводу:
"Я не могу тянуть такую непосильную ношу рассылки. Поэтому ухожу в тень Магистриуса Вована. Теперь буду отвечать на мелкие вопросы, писать маленькие проги и добавлять мало строчек в рассылку".
Очень жалко, но это действительно так. Но, несмотря на это, рассылка будет выходить в том же объёме, в котором она выходила и раньше. Теперь перейдём к нашему выпуску.

Intro

Для того чтоб хранить информацию, Вы используете различные устройства хранения: винчестера, CD-,DVD- ROMы, гибкие диски, флеш и пр. Именованные области на этих носителях и называют файлами.
Файл имеет имя, что позволяет работать сразу с несколькими файлами. Файл имеет длину, а длина создаваемого файла ограничивается только емкостью устройств "внешней" памяти. Также можно сказать, что файл - последовательность компонент одного типа (кроме типа file, о котором читайте ниже). Работа с файлами в среде Паскаля возможна с использованием файловых переменных.

1. Файловые переменные.

Файловые переменные, в зависимости от того, с каким файлом мы собираемся работать и как его использовать, могут быть поделены на три класса (перечисление в том порядке, в котором мы будем их рассматривать):

0) типизированные файлы
1) текстовые файлы
2) нетипизированные файлы.

Больше всего внимания я буду уделять типизированным и нетипизированным файлам, так как они используются чаще всего.

Файловые переменные - особый вид переменных, так как над ними нельзя производить никаких операций (сравнения, присваивания...). Они могут использоваться только как параметры, которые передаются в процедуры и функции, которые работают с файлами.

1.0. Типизированные файлы.

Чтоб задать тип переменной нам нужно будет использовать зарезервированные для этого слова File и Of, а также знать основные типы данных.
Теперь общий вид объявления типа файловой переменной:

Type
Name_of_type = File Of Name_of_Type2;

После этого файл, который описывает переменная типа Name_of_type, будет расцениваться как "сборище" данных типа Name_of_Type2.

Теперь пример объявления файловых типов и переменных:

Type
TEKCT = file of string[20];
HOMEP = integer;
Var
file1: TEKCT;
file2: file of byte;
file3: file of HOMEP;
file4: file of char;


Разбираемся по порядку.
В разделе объявления типов мы объявили два типа. Первый - TEKCT. Переменная данного типа будет расцениваться как переменная файлового типа. Содержимое файла, cвязанного с данной переменной, будет расцениваться как "массив" строк, которые имеют длину 20.
Следующий тип эквивалентен типу integer.
Дальше идёт раздел объявления переменных.

file1 - типизированная переменная вышеописанного типа.
file2, file3 - аналогично
file4 - типизированная переменная. Соответствующий файл содержит char'ы

1.1. Текстовые файлы

Переменная должна иметь файловый тип Text. Переменные данного типа применяется при работе с обычными текстовыми файлами, содержимое которых представляется как последовательность символов, которые являются составными частями строк, а каждая строка заканчивается двумя символами - chr(13) и chr(10).

Объявление переменной для текстового файла:

var
name: text;


где name - имя файловой переменной.

1.2. Нетипизированные файлы.

Переменная объявляется с использованием одного слова - File. При работе с нетипизированным файлом нам без разницы то, какого рода информация там хранится. Работа с ним напоминает работу со стандартным вводом/выводом.

Объявление переменной для нетипизированного файла:

var
name: file;


где name - имя файловой переменной.

2. Работа с файловыми переменными.

Когда мы только объявили файловую переменную, она ничего не делает, кроме того, что занимает место в программе. Чтоб можно было её использовать, нужно связать её с каким либо файлом. После этого мы работаем с файлом через эту переменную. Для того чтоб связать файл с переменной нужно вызвать процедуру Assign(var F; name:string);, где F - файловая переменная любого файлового типа, а name - строка, которая содержит имя файла, которое состоит из пути к файлу (если файл находится в текущей директории, то путь можно не указывать), и собственно имени файла. После вызова процедуры операции с переменной F будут на самом деле происходить с внешним файлом с именем name.

Но для работы с файлом нужно подготовить его к работе, т.е. открыть. Для этого надо вызвать процедуру Reset(var F);, где F - файловая переменная любого файлового типа, которая открывает существующий файл. После этого мы можем выполнять операции чтения (над любыми файлами) и записи (кроме текстовых).

Существует также процедура ReWrite(Var F);, которая создает и открывает файл, а если файл существует, то сначала удаляет его. После вызова процедуры будет создан пустой файл. Мы можем выполнять операции записи в этот файл (читать нечего, ведь файл пустой).

После того, как мы поработаем с файлом, мы должны его закрыть, используя процедуру Close(Var F);, которая закрывает ранее открытый файл.

2.0. Работа с типизированными файлами.

Типизированный файл - файл, который содержит данные одного типа. Для связывания файла с переменной нужно вызвать процедуру Assign. Для открытия можно вызвать одну из двух процедур - Reset (просто откроет файл, если он существует) или ReWrite (если хотите создать новый файл).

Чтение и запись в типизированный файл вы можете осуществлять, используя процедуры Read и Write.

read(F, var1[,var2 ...]);

Первой в списке параметров идёт файловая переменная, а после неё список переменных того же типа, что и компоненты файла, в эти элементы и будyт помещены значения из файла. Если мы достигли конца файла, то вызов read возвратит ошибку.

Write(F, var1[,var2 ...]);

Работает аналогично, только теперь значения переменных записываются в файл, а не считываются оттуда.

Как при чтении, так и при записи 1 элемента, указатель (текущая позиция в файле) увеличивает своё значение на 1.

В типизированном файле, как и в нетипизированом, мы можем перемещаться к произвольному элементу, используя процедуру Seek(Var f; N:Longint);, где N - номер компоненты, к которой нужно перейти.

Для того, чтоб узнать кол-во элементов в файле нужно вызвать функцию FileSize(var f): Longint;, которая возвратит кол-во элементов.

Также существует функция, которая возвращает текущую позицию FilePos(var f): Longint;

Теперь для того, чтобы закрепить теорию, напишем пару программ.
Первая программа - она будет добавлять элемент.
Вторая - будет выводить элементы.
Программа №1. Oрганизация ввода.

Uses CRT;
Var
ff:file of integer; {файловая переменная}
ntgr:integer; {переменная, в которую будем в файл записывать}

Begin
ClrScr;
Assign(ff,'baza.cpm'); {связь переменой с файлом}
ReWrite(ff);{создаём новый файл}

Repeat
 Write('введите число (0-выход): ');{сообщение}
 ReadLn(ntgr);{читаем число}
 Write(ff,ntgr);{пишем его в файл}
Until ntgr=0;{когда ввели 0 - выходим}

readln;
Close(ff);
End.


Программа №2. Oрганизация вывода.

Uses CRT;
var
ff:File Of Integer;
ntgr:Integer;

begin
ClrScr;
Assign(ff,'baza.cpm');
Reset(ff); {открываем файл.}

While NOT(EoF(ff)) Do Begin {пока не достигнем конца файла выполняем тело цикла}
 Read(ff,ntgr); {читаем элемент из файла в переменную}
 WriteLn(ntgr); {выводим на экран}
End;

ReadLn;
Close(ff);
End.


Теперь подробнее о конце файла. Функция EoF(var F):boolean; возвращает true, если достигнут конец файла. Для более подробного изучения данного вида файлов, мы в конце напишем программу - элементарный телефонный справочник, только немного позже.

2.1. Работа с текстовыми файлами.

Это очень неудобный тип файлов с точки зрения программирования. Мы не можем корректно сохранять, а после загружать числа, мы не можем переходить к произвольному элементу. Зато при работе с текстовыми файлами становится доступна процедура Append(Var F:Text);, которая открывает файл и устанавливает указатель в конец файла.

Также мы можем использовать следующие функции:

SeekEoLn (Var F:text):boolean;, которая пропускает все пробелы и табуляции до первого значащего символа или до символа конца строки. Возвращаемое значение - состояние конца строки в файле.

SeekEoF (Var F:text):boolean; - аналогично, только ещё и конец строки пропускает. Останавливается, если видит значащий символ или конец файла.

EoLn(Var F:text):boolean; - просто возвратит true, если доберёмся до конца строки.

Очень хорошие примеры на использование SeekEoLn и SeekEoF есть в хелпе паскаля. Если вы до сих пор не умеете пользоваться хелпом - дальше можете не читать.

Также, работая с текстовыми файлами, вы можете использовать не только write/read, но и writeln/readln!

Работать с текстовыми файлами не очень удобно, но возможно. Мы напишем программу, которая будет дописывать в конец всех файлов, которые имеют расширение .PAS такие строки:

(******************************
*    *
* (c) 2004-2005 Kiev Ukraine [СPM] Group.   *
*       *
******************************)

Чтоб написать такую прогу, вам нужно ещё знать несколько полезных процедур, которые обеспечат вас возможностью поиска файлов в каталоге. Но для того, чтоб рассмотреть работу этих процедур, нужно знать ещё один тип данных - запись, который мы рассмотрим чуть дальше в выпуске.

2.2. Работа с нетипизированными файлами.

При работе с нетипизированными файлами мы имеем дели с n-байтными последовательностями. Тип данных у нас не указан. То есть, если n=1, то мы будем читать файл побайтно. Такой подход имеет много преимуществ - совместимость с любыми типами файлов, высокая скорость работы (быстрый обмен данными между диском и памятью).

Вы уже знаете, что файловые переменные для нетипизированных файлов имеют файловый тип File.
Число n для нетипизированного файла указывается вторым параметром в процедурах Reset или Rewrite. Если второй параметр отсутствует, то n=128.

Чтение/запись нетипизированного файла осуществляется процедурами. BlockRead/BlockWrite, которым в качестве параметров передаются файловая переменная и переменная-буфер, в которую производится запись, а также число, которое определяет кол-во записей длины n байт, которое надо считать/записать.

Несколько слов о защите от дурака:

Допустим, файл отсутствует или мы по каким-нибудь другим причинам не смогли получить к нему доступ. Тогда процедурa ReWrite/Reset/Append возвратит ненулевой результат, после чего программа завершится и будет выдано сообщение об ошибке времени выполнения. Но ведь мы хотим контролировать этот процесс.

Существует переключатель $I, который позволяет выключить контроль ошибок ввода/вывода. Но как тогда узнать возникла ли ошибка? - Очень просто - вызвать функцию IOResult:boolean, которая в случае провала возвратит ненулевое значение.

Теперь напишем программу, которая будет анализировать .ЕХЕ-файл, используя поля заголовка.

uses crt;
var
fn:String; {Строка под имя файла (имя вводит пользователь)}

Procedure GetExeInfo(str_:String); {процедура получения инфы}
var
f:File; {файловая переменная}
w:Word; {буфер для чтения}
Begin
Assign(f,str_); {связь с файлом}

{$I-}{выключаем контроль ошибок}
Reset(f,2); {открываем файл с размером записи 2 байта}
{$I+} {включаем его}

If IOResult <>0 Then Begin WriteLn ('Error:Cannot read File'); {проверяем, были ли ошибки и если были}
 Exit; {то выводим сообщение и выходим}
end;

BlockRead(f,w,1); {читаем первое слово (2 байта)}
If (w<>$5a4d) AND (w<>$4d5a) Then Begin {в ЕХЕ файле первые 2 байта - сигнатура $4d5a='MZ'}
 WriteLn('It is not EXE file');
 Exit; {если сигнатуры нет - то это не ЕХЕ файл}
end;
WriteLn('ZM Checked. OK');
WriteLn('File size is: ', FileSize(f)*2, ' Bytes);
BlockRead(f,w,1);

BlockRead(f,w,1);
{Пропускаем поля} BlockRead(f,w,1);
WriteLn('Number of elements in OPTION TABLE is ',w);

BlockRead(f,w,1);
WriteLn('HdrSize checked. Size of the Header is ',w*16,' bytes');

BlockRead(f,w,1);
WriteLn('MinMem checked. You need ',w*16, ' bytes');

BlockRead(f,w,1);
WriteLn('MaxMem checked. Maximum memory have is ' ,w*16, ' bytes');

BlockRead(f,w,1);
WriteLn('ReloSS checked. Segment offset of stack is ',w);

BlockRead(f,w,1);
WriteLn('ExeSP cheked. Segment entry offset is ',w);

BlockRead(f,w,1);
WriteLn('CRC checked. Ignored');

BlockRead(f,w,1);
WriteLn('ExeIP checked. Entry point is xxxx:',w);

BlockRead(f,w,1);
WriteLn('ReloCS checked. Segment offset of CS is ',w);
{Читаем по порядку все поля заголовка ЕХЕ файла (его структуру вы можете найти в интернете)}
Close(f);
WriteLn;
End;

Begin
ClrScr;
Write('Please Enter the filename: '); {Просим ввести имя файла}
ReadLn(fn);
{получаем имя файла}
GetEXEInfo(fn); {и передаём в процедуру как параметр}
ReadLn;
End.


Для самостоятельной работы можете написать программу, которая в заданном файле заменяет все буквы o и О на сhr(1), a 1 на !.

3. Новый тип данных.

Новый тип данных - запись (record).
Запись - это структура, которая очень похожа на массив, но имеет ряд преимуществ. Поля записи - как ячейки массива, но они могут быть различных типов, а чтоб их различать, каждому полю даётся имя.

Синтаксис:

Type
name = Record
Поля;
Поля;
...
Поля
End;

Замечания:
Каждый список полей - список идентификаторов, разделенных запятыми сопровождаемых двоеточием и указанием типа.

Пример:

Type
Date = Record {Объявляем запись с именем Date}
D, M, Y : Integer; {состоящую из 3 полей типа Integer}
Name : String[10] {и 1 поля типа String[10]}
End;

Var
da: Date; {объявляем переменную, которая будет записью}


Каждое поле записи доступно при обращении через составное имя.

Пример:

da.Name := 'FreeMan';

Также можно упростить доступ к полям, используя операторы With и Do

Пример:

With da Do Begin
Name := 'FreeMan';
D := 13;
M := 2;
Y := 88;
end;


Более подробно об этом типе почитайте в справке. Там на самом деле ничего сложного нет. Этот тип используется в процедурах поиска и работы со временем модуля DOS, а мы будем его юзать при создании своего телефонного справочника.

4. Функции и процедуры.

В этой части мы рассмотрим те процедуры и функции для работы с файлами, которые мы не рассмотрели раньше, а также процедуры и функции из модуля DOS.

ReName (Var F; NewName); - процедура переименовывает файл, связанный с файловой переменной, которая передаётся первым параметром. Новое имя файла задаётся вторым параметром.
Контроль ошибок - функция IOResult с выключенным $I вoзвращает в случае неудачной попытки ненулевое значение.

Erase(Var F); - удаляет файл, связанный с файловой переменной, которая передаётся в процедуру. Если файл открыт процедурой Reset/Append/ReWrite, то его надо закрыть перед выполнением этой процедуры.

Flush(Var F);
Дело в том, что любая работа с файлом производится с использованием буфера. То есть информация не сразy записывается на диск, а какое-то время находиться в памяти. Чтоб перенести данные из буфера на диск используется эта процедура.

GetDir(D:Byte; Var S:String); - в строковую переменную, переданную вторым параметром передаётся путь к каталогу, который является текущим для диска, номер которого указан первым параметром (0 - текущий диск, 1 - диск А, 2 - диск В...). Если диск недопустим, то в строку будет записано X:\.

ChDir(S:String); - Меняет текущий каталог на каталог, заданный параметром S.

MkDir(S:String); - создаёт каталог с именем, заданным параметром S. Имя каталога не должно совпадать с именем существующего файла.

RmDir(S:String); - удаляет ПУСТОЙ каталог с именем заданным параметром S.

Теперь рассмотрим некоторые процедуры и функции модуля DOS

Процедуры даты и времени:

GetDate(var year, month, day, dayofweek:word); - Возвращает текущую дату, установленную в операционной системе. В переменную year попадает год, month - месяц, day - день, dayofweek - день недели.

GetTime (Var Hour, Minute, Second, Sec100:Word); - Возвращает текущее время в операционной системе.

Hour - часы
Minute - минуты
Second - секунды
Sec100 - сотые доли секунды

GetFTime (Var F; Var Time:Longint); - Возвращает дату и время обновления файла (значение упаковано)

UnpackTime (Time:Longint; var DT: DateTime); Преобразовывает 4-х байтовое, упакованное значение типа Longint, полученное от GetFTime, FindFirst, или FindNext в запись типа DateTime.

Запись DateTime имеет следующую структуру:

type
DateTime = Record
Year, Month, Day: Word;
Hour, Min, Sec: Word;
end;


PackTime (Var T: DateTime; Var Time :Longint); - Преобразyет запись типа DateTime в LongInt.

Диапазоны:

Year 1980 .. 2099 {год}
Month 1 .. 12 {месяц}
Day 1 .. 31 {день}
Hour 0 .. 23 {час}
Min =Minute 0 .. 59 {минута}
Sec=Second 0 .. 59 {секунда}
Sec100 0..99

SetDate, SetFTime, SetTime разберите сами. В хелпе всё доходчиво написанно.

Функции обработки файлов:

FExpand (Path : PathStr) : PathStr; В качестве параметра принимается имя файла. Тип PathStr = String[79]. Дополняет имя, указывая директорию и устройство (диск).

FSplit (Path:PathStr; Var Dir: DirStr; Var Name: NameStr; Var Ext: ExtStr); Разбивает имя файла на три его компонента.
Типы DirStr, PathStr, NameStr, ExtStr определены в модуле DOS. FSearch (Path: PathStr; DirList: String) :PathStr; Ищет файл с именем, которое задано параметром Path, в списке каталогов, который задан параметром DirList. Если файл найден, то возвращается строка, которая содержит путь и имя искомого файла. Если файл не найден, то возвращается пустая строка.

Например, на диске есть файл \pascals\pascal.exe. Тогда обращение

FSearch ('pascal.exe', '\blabla; \asdgf; \pascals');

Вернёт строку \pascals\pascal.exe, a

FSearch ('pascal.exe', '\blabla; \asdgf');

Вернёт пустую строку. Но тут есть один интересный момент - если текущий каталог pascals, то вернётся 'pascal.exe' (в обоих случаях)


FindFirst (Path:String; Attr: Word; Var F : SearchRec); Ищет файл в заданном (или в текущем) каталоге первый файл, который удовлетворяет заданному имени и набору атрибутов.

Теперь разберём каждый параметр.

Path - строка, в которой маска (если файл в текущем каталоге можно путь не указывать) файла, который надо найти. Также возможно использование *, ? при формировании маски.

Если вы ставите *, то считается, что вместо этой * может быть (или не быть) любая последовательность символов.

Если ставите ?, то считается, что вместо ? должен быть 1 символ.

Рассмотрим на примере:

*.pas - выбирает все файлы, которые имеют расширение pas
?a*.* - выбирает все файлы, у которых 2-ая буква а.
Attr - аттрибуты файла.
Может быть значением или комбинация значений, которые следуют дальше (константы объявлены в модуле DOS)

const
ReadOnly = $01; {только чтение}
Hidden = $02; {скрытый файл}
SysFile = $04; {системный файл}
VolumeID = $08; {идентификатор тома}
Directory = $10; {имя подкаталога}
Archive =$20; {aрхивный файл}
AnyFile= $3F; {любой файл (легко заметить, что это комбинация всех констант)}


Все результаты работы этой процедуры забиваются в переменную типа SearchRec, который объявлен в модуле DOS следующим образом:

Type SearchRec = Record
Fill : Array [1..21] Of Byte;
Attr : Byte;
Time : Longint;
Size : Longint;
Name : String[12];
End;


- Attr содержит атрибуты файла (состоящие из констант атрибутов файлов)
- Time содержит его дату и время (используйте UnpackTime, чтобы распаковать запакованные данные)
- Size содержит его размер в байтах
- Name содержит его имя
- Параметр Fill зарезервирован DOS и не должен изменяться

FindNext (Var F: SearchRec);
Ищет следующий файл. Если файл не найден, то переменная DosError (объявлена в модуле DOS) содержит ненулевое значение.

GetFAttr, SetFAttr - разберите самостоятельно.

Теперь можно написать программу, работающую с текстовыми файлами.

Uses DOS,CRT; {подключаемые модули}
Var
sr: SearchRec; {запись для процедур поиска}
f: Text; {файловая переменная для текстового файла}

Begin
ClrScr; {очищаем экран}
FindFirst ('*.PAS', Archive, sr); {ищем первый паскалевский файл}

While DosError=0 Do Begin {цикл, который завершается, когда не можем найти файл}

 {$I-}
 Assign(f,sr.Name); {связываем файл с переменной. имя файла берём из записи для поиска}
 {$I+}

 If IOResult=0 Then Begin {если ошибок не возникло - делаем что хотим}
  Append (f); {открываем файл для присоединения}
  WriteLn(f,Chr(10),Chr(13),'(*******************************');{в конце файла ставим символы новой строки и печатаем сообщение}
  WriteLn(f, '* *');
  WriteLn(f, '*(c) 2004-2005 Kiev, Ukraine [CPM] Group *');
  WriteLn(f, '* *');
  WriteLn(f, '********************************)');
  Close(f); {закрываем файл}
  WriteLn(sr.Name, ' был дополнен'); {выводим сообщение на экран}
 End;

 FindNext(sr); {ищем следующий}
End;

ReadKey; {ждём нажатия}
End.


Как вы видите, работа с файлами - дело довольно интерестное и лёгкое. Графика сложнее. Кстати, теперь вы можете написать просмотровщик графических файлов...

5. Телефонный справочник

Сейчас мы напишем элементарный телефонный справочник, который может послужить базой для вашего творчества. На его основе вы можете сделать очень даже неплохой органайзер. Но для этого вам прийдётся немного постаратся, дополнить код, украсить.
Вот сам код. Наслаждайтесь. Привожу с минимумом коментариев

Uses CRT;
Type
Phone = Record{тип записи для наших нужд}
 FName: String[15];{имя}
 LName: String[15];{фамилия}
 Tel: LongInt;{телефон}
 Tcode: LongInt{код страны без + и города}
End;

Var
zap: Phone;{запись}
f: File Of Phone;{файловая переменная}
ex:Boolean;
ch:Char;

{функция возвращает TRUE, если файл существует}
Function Exist(fl:string):Boolean;
Var
ff:File;
Begin
Assign(ff,fl);
{$I-}
Reset(ff);
Close(ff);
{$I+}
Exist:=(IOResult=0) AND (fl<>'');
End;

{процедура вывода базы на экран}
Procedure vivod;
Var fpos:Word;
Begin
Seek(f,0);
ClrScr;

While NOT EoF(f) Do Begin
 fpos:=FilePos(f);

 If fpos MOD 12=0 Then Begin
  WriteLn('Press ENTER for scrolling');
  ReadLn;
  ClrScr;
 End;

 Read(f,zap);
 GotoXY(fpos MOD 2 * 35 + 1, fpos MOD 12 DIV 2 * 4 +1);
 WriteLn('First Name: ', Zap.FName);
 GotoXY(fpos MOD 2 * 35 + 1, fpos MOD 12 DIV 2 * 4 +2);
 WriteLn('Last Name: ', Zap.LName);
 GotoXY(fpos MOD 2 * 35 + 1, fpos MOD 12 DIV 2 * 4 +3);
 WriteLn('Telephone: ', Zap.Tcode, '-',Zap.Tel);
End;
ReadLn;
End;

{ввод одной записи}
Procedure vvod;
Begin
ClrScr;
Seek(f,FileSize(f));
Write('Enter First name: ');
ReadLn(zap.FName);
Write('Enter Last name: ');
ReadLn(zap.LName);
Write('Enter Phone number (ex.5555555): ');
ReadLn(zap.tel);
Write('Enter country+place code (ex.38044): ');
ReadLn(zap.tcode);
Write(f,zap);
End;

{процедура поиска телефона по имени или фамилии владельца}
Procedure find;
Var
st:String;
res:Boolean;
Begin
ClrScr;
res:=FALSE;
Write('Please enter the name: ');
ReadLn(st);
Seek(f,0);

While NOT(EoF(f)) Do Begin
 Read(f,zap);

 If (st=zap.Fname) OR (st=zap.Lname) Then Begin

  WriteLn('Telephone: ',zap.tel, #10,#13,'Country Code: ', zap.Tcode,#10,#13);
  res:=TRUE;
 End;

End;

If NOT(res) Then Writeln('There is no such Name in base');

ReadLn;
End;

Begin

Assign(f,'my.tel');

If Exist('my.tel') Then Reset(f) Else ReWrite(f);

ex:=FALSE;

Repeat
 ClrScr;
 WriteLn('Menu');
 WriteLn('1. Show All');
 WriteLn('2. Create New');
 WriteLn('3. Find');
 WriteLn('4. Exit');
 ch:=ReadKey;

 Case ch Of
  '1': vivod;
  '2': vvod;
  '3': find;
  '4': ex:=TRUE
 End;

Until ex;
End.


Вы можете добавить несколько пунктов меню (типа Удалить, найти по номеру телефона...) Можете в запись добавить дату рождения, E-Mail... Сделать конвертацию любой записи или всей базы в текстовый файл.
Теперь, когда вы освоили работу с файлами, вы можете делать практически всё, что пожелаете.
Высылайте свои супер-проэкты и вопросы мне или MedL'у, наши адреса электронной почты и ICQ вы можете посмотреть в конце рассылки.

Наша команда [CPM]:

Дизайн, верстка и корректировка >>> Ustas[CPM]

Пишет >>> FreeMan[CPM]
ICQ:88880172

  Помогает >>> FreeMan[CPM]
ICQ:88880172

::[Ø]END.[Ø]::

© 2004 Kiev Ukraine [CPM] Group 

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.pascalcpm
Отписаться

В избранное