Программа
{
Формат текстового файла:
-одна строка одна запись
-поля отделяются одним пробелом
-отсутствие телефона опредилить прочерком
Для всех операций, кроме ввода из текстового
файла, файл note.dat должен существовать.
Отсутствие приведёт к ошибке времени исполнения.
При удалении записи, не указывать нулевую.
В разных реализациях систем программирования
это может привести к ошибкам: создание очень
длинного файла или ошибка времени исполнения.
При указании номера удаляемой записи больше
существующего, удаляется последняя запись.
Удаление записи из пустого файла приведёт к
ошибке времени исполнения.
}
CONST
BaseFileName='note.dat';
TYPE
R=record { Тип записи }
Family,Name,Patronym,
City,Street,Building,Apartment,
TelNumber:string;
end;
VAR
Exit:boolean; { Флаг выхода из программы }
FUNCTION Menu:integer; { Функция вывода меню и получения ответа }
Const
QuantityMenuPoint=7; { Количество пунктов меню }
ExitPoint=QuantityMenuPoint; { Пункт меню "Выход" }
Var
Point:integer; { Выбранный пункт меню }
AnswerBuf:char; { Переменная для получения ответа на меню }
Begin
repeat { Цикл вывода меню и чтения клавиатуры }
WriteLn;
WriteLn('МЕНЮ:');
WriteLn('[1] Ввод из текстового файла'); { Содержание note.dat уничтожается }
WriteLn('[2] Добавление записи'); { Здесь и далее note.dat должен существовать }
WriteLn('[3] Просмотр книжки');
WriteLn('[4] Поиск записей');
WriteLn('[5] Удаление записи');
WriteLn('[6] Упорядочивание');
WriteLn('[7] Выход');
ReadLn(AnswerBuf); { Чтение ответа на меню }
Point:=Ord(AnswerBuf)-Ord('0'); { Перевод полученного символа в пункт меню }
until Point in [1..QuantityMenuPoint];
{ Выход из цикла при пролучении корректного ответа }
if Point=ExitPoint { Определение значения функции}
then Menu:=255
else Menu:=Point
End;
PROCEDURE WriteRecord(const i:integer; const Buf:R);
Begin { Процедура печати отдельной записи }
WriteLn('[',i:2,'] ',
Buf.Family:12, Buf.Name:12, Buf.Patronym:14,
Buf.City:10, Buf.Street:12, Buf.Building:3,
Buf.Apartment:3, Buf.TelNumber:8)
End;
PROCEDURE copyTextToData; { Процедура добавления записей из текстового файла }
Var InputFileName:string; { Имя входного файла }
Fin:text; { Указатель на входной текстовый файл }
Fout:file of R; { Указатель на типизированный файл данных }
Buf:R; { Буфер для формировани записи }
BufS:string; { Буфер для чтения строки из текстового файла }
i:integer; { Счётчик записей }
Function coupString(var S:string):string;
{ Функция вырезания из текстовой строки первого поля для записи }
var P:integer; { Позиция пробела }
begin
P:=Pos(' ',S); { Поиск пробела }
coupString:=Copy(S,1,P-1); { Копирование подстроки }
Delete(S,1,P); { Удаление начальной части строки }
end;
Begin
Write('Введите имя файла '); { Запрос имени файла }
ReadLn(InputFileName); { Чтение имени файла }
{ Связывание файловых переменных: }
Assign(Fin,InputFileName); {-с входным текстовым файлом}
Assign(Fout,BaseFileName); {-с выходным типизированным файлом }
Reset(Fin); { Открытие файла на чтение }
Rewrite(Fout); { Открытие файла на запись }
while not EOF(Fin) do { Цикл чтения файла }
begin
ReadLn(Fin, BufS); { Чтение строки }
with Buf do { Формирование записи }
begin { Последовательное определение полей записи: }
Family:=coupString(BufS);
Name:=coupString(BufS);
Patronym:=coupString(BufS);
City:=coupString(BufS);
Street:=coupString(BufS);
Building:=coupString(BufS);
Apartment:=coupString(BufS);
TelNumber:=BufS
end;
Write(Fout,Buf) { Запись данных в типизированный файл }
end;
{ Закрытие файлов: }
Close(Fin);
Close(Fout);
WriteLn('Записи добавлены')
End;
PROCEDURE viewData; { Процедура просмотра записной книжки }
Var
F: file of R; { Указатель файла книжки }
Buf:R; { Буфер для чтения из файла }
i:integer; { Счётчик записей }
Begin
i:=0; { Сброс счётчика }
Assign(F,BaseFileName); { Связывание указателя на файл }
Reset(F); { Открытие файла }
while not EOF(F) do { Цикл чтения файла }
begin
Inc(i); { Инкремент счётчика }
Read(F,Buf); { Чтение записи }
WriteRecord(i,Buf) { Вывод записи }
end;
Close(F)
End;
PROCEDURE ReadRecord(var Buf:R);
Begin { Процедура ввода записи }
Write('Фамилия: '); ReadLn(Buf.Family);
Write('Имя: '); ReadLn(Buf.Name);
Write('Отчество: '); ReadLn(Buf.Patronym);
Write('Город: '); ReadLn(Buf.City);
Write('Улица: '); ReadLn(Buf.Street);
Write('Дом: '); ReadLn(Buf.Building);
Write('Квартира: '); ReadLn(Buf.Apartment);
Write('Телефон: '); ReadLn(Buf.TelNumber);
End;
PROCEDURE addRecord; { Процедура добавления записи }
Var Buf:R; { Буфер для ввода записи }
F:file of R; { Файловая переменная }
Begin
ReadRecord(Buf); { Чтение записи }
Assign(F,BaseFileName); { Связывание файловой переменной }
Reset(F); { Открытие файла для записи }
Seek(F,FileSize(F)); { Позиционирование файлового указателя на конец }
Write(F,Buf); { Добавление записи в файл }
Close(F) { Закрытие файла }
End;
PROCEDURE seekRecord; { Процедура поиска записи }
Var Mask, Buf:R; { Маска поиска и буфер для чтения из файла }
f:file of R; { Указатель на файл книжки }
i:integer; { Счётчик записей }
Function Comp(const Mask:string; const S:string):boolean;
begin { Функция сравнения маски с элементом записи }
Comp:=(Mask='') or (Mask=S);
{ Запись удовлетворяет условию поиска если
маска равна полю записи или маска пустая }
end;
Begin
{ Вывод приглашения и ввод маски }
WriteLn('Введите значения полей искомых записей');
ReadRecord(Mask);
Assign(F,BaseFileName); { Связывание файлового указателя }
Reset(F); { Открытие файла }
i:=0; { Инициализация счётчика записей }
while not EOF(F) do { Цикл просмотра файла }
begin
Inc(i); { Инкремент счётчика записей }
Read(F,Buf); { Чтение записи из файла }
if Comp(Mask.Family, Buf.Family) and Comp(Mask.Name, Buf.Name) and
Comp(Mask.Patronym, Buf.Patronym) and Comp(Mask.City, Buf.City) and
Comp(Mask.Building, Buf.Building) and Comp(Mask.Street, Buf.Street) and
Comp(Mask.Apartment, Buf.Apartment) and
Comp(Mask.TelNumber, Buf.TelNumber)
then WriteRecord(i,Buf) { Запись выводится, если она удовлетворяет критерию поиска }
end;
Close(F) { Закрытие файла }
End;
PROCEDURE delRecord; { Процедура удаления записи }
Var N,i:integer; { Номер удаляемой записи и счётчик записей }
Buf:R; { Буфер для чтения записи }
F:file of R; { Указатель на файл }
Begin
{ Вывод приглашения и ввод номера записи }
Write('Введите номер удаляемой записи ');
ReadLn(N);
Assign(F,BaseFileName); { Связывание файловой переменной }
Reset(F); { Открытие файла }
for i:=N to FileSize(F)-1 do { Цикл перестановки записей }
begin { начиная со следующей после удаляемой и до конца }
Seek(F,i); { Позиционирование на элемент }
Read(F,Buf); { Чтение }
Seek(F,i-1); { Позиционирование на предыдущую позицию }
Write(F,Buf) { Запись элемента }
end;
Seek(F,FileSize(F)-1); { Позиционирование на последний элемент }
Truncate(F); { Удаление записей начиная с текущей позиции }
Close(F) { Закрытие файла }
End;
PROCEDURE sort; { Процедура сортировки }
Var Field:char; { Символ определяющий поле и порядок сортировки }
Point,Buf:R; { Записи: первая из неотсортированной части и буфер
для чтения последующих }
F: file of R; { Файловая переменная }
i,j,P:integer; { Счётчики внешнего цикла сортировки,
внутренний по неотсортированной части и
номер записи выбранной для перестановки с первым
неотсортированным элементом }
Function Comp(const Field:char; const Point:R; const Second:R):boolean;
begin { Функция сравнения записей }
case Field of { Символ Field определяет поле записи и направление сортировки }
'F': Comp:=Point.Family > Second.Family;
'N': Comp:=Point.Name > Second.Name;
'P': Comp:=Point.Patronym > Second.Patronym;
'C': Comp:=Point.City > Second.City;
'S': Comp:=Point.Street > Second.Street;
'B': Comp:=Point.Building > Second.Building;
'A': Comp:=Point.Apartment > Second.Apartment;
'T': Comp:=Point.TelNumber > Second.TelNumber;
'f': Comp:=Point.Family < Second.Family;
'n': Comp:=Point.Name < Second.Name;
'p': Comp:=Point.Patronym < Second.Patronym;
'c': Comp:=Point.City < Second.City;
's': Comp:=Point.Street < Second.Street;
'b': Comp:=Point.Building < Second.Building;
'a': Comp:=Point.Apartment < Second.Apartment;
't': Comp:=Point.TelNumber < Second.TelNumber;
end
end;
Begin
{ Вывод приглашения и ввод критерия сортировки }
Write('Укажите поле и направление, прописные символы - возрастание, строчные - убывание [F|N|P|C|S|B|A|T]: ');
ReadLn(Field);
Assign(F,BaseFileName); { Связываниие файловой переменной }
Reset(F); { Открытие файла }
for i:=0 to FileSize(F)-2 do { Цикл сортировки }
begin
Seek(F,i); { Установка позиции чтения на первый
элемент из неотсортированной части }
Read(F,Point); { Чтение элемента }
P:=i; { Определение номера первого элемента как наилучшего
из просмотренных }
for j:=i+1 to FileSize(F)-1 do { Цикл поиска лучшего элемента, }
begin { просмотр неотсорированной части файла }
Read(F,Buf); { Чтение записи }
if Comp(Field,Point,Buf) { Если текущая запись лучше }
then begin { то }
Point:=Buf; { переопределение значения предыдущей лучшей }
P:=j { переопределение номера предыдущей лучшей }
end
end;
{ Перестановка элементов }
Seek(F,i); { Позиционирование на первый из неотсортированной части }
Read(F,Buf); { Чтение элемента }
Seek(F,i); { Повторное позиционирование }
Write(F,Point); { Запись наилучшего элемента }
Seek(F,P); { Позиционирование на элемент содержавший лучшую запись }
Write(F,Buf); { Запись элемента бывшего первый в неотсортированной части }
end;
Close(F); { Закрытие файла }
End;
BEGIN
Exit:=FALSE; { Сброс флага "Выход" }
repeat { Цикл работы программы }
case Menu of { Выбор действия по ответу на меню }
1:begin copyTextToData; viewData end; { Чтение книжки из текстового файла и вывод }
2:begin addRecord; viewData end; { Добавление записи и вывод }
3:viewData; { Просмотр всей книжки }
4:seekRecord; { Поиск записей }
5:begin delRecord; viewData end; { Удаление записи и вывод книжки }
6:begin sort; viewData end; { Сортировка и вывод книжки }
255:Exit:=TRUE { Подъем флага "Выход" }
end
until Exit;
END.
{
Автоматизированная записная книжка должна содержать следующую информацию:
фамилия, имя, отчество,
адрес( город, улица, дом, квартира),
телефон(если есть).
Вывести фамилии и телефоны всех лиц, проживающих в г.Саратове на улице Солнечной.
Требования, предъявляемые к решению задач с файлами:
1 Исходный файл должен быть типзированным
2 Результ. сведения- в файл.(текстовый или типизированный)
3 Необходимо разработать режимы работы:
а)Создание исходного файла(подпрограмма или кусок работы)
б)Просмотр файла(не выходя из программы)
в)создание результ. файла
г)Добавление новых записей
д)Удаление записей
ж)Упорядочивание записей
}
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию