Program zadacha2;
Uses crt;
type str=record
     FIO:string[30];
     tel:longint;
     god:integer;
     kab:integer;
     plt:integer;
     end;
     Fl=file of str;
Var f:Fl; p:char; a:str; name:string; k:byte;z:integer;label l;
{---------вывод шапки таблицы-----------}
procedure tabl;
 begin
  writeln('Абонентская плата за телефон');
  writeln(' --------------------------------------------------------- ');
  writeln('| Ф.И.О.    | Телефон | Год       | Количество | Плата за |');
  writeln('| абонента  |         | установки | абонентов  | телефон  |');
  writeln(' --------------------------------------------------------- ');
 end;
{---------чтение данных одной записи--------}
procedure danzap;
 begin
  Assign(f,'2.dat');
  Reset(f);
  writeln;
  writeln('чтение данных одной записи');p:=' '; seek(f,0);
  writeln(a.FIO,p,a.tel,p,a.god,p,a.kab,p,a.plt);
  Close(f);
  end;
procedure cht;
forward;
procedure zap;
forward;
{---------создание файла--------}
procedure sozd;
var name:string;
 begin
  writeln('создание файла');
  Assign(f,'2.dat');
  Rewrite(f);
  Close(f);
  writeln('файл 2.dat создан');
  end;
{---------дополнение файла---------}
procedure dop;
 begin
  writeln;
  writeln('дополнение файла');
  zap;
  writeln('после дополнения файла:'); cht;
  end;
{---------заполнение файла---------}
procedure zap;
var fid:text; n,i:integer;
 begin
  Assign(f,'2.dat');
  reset(f);
  writeln;
  writeln('Сколько записей вы хотели бы ввести:');
  readln(n);
  seek(f,filesize(f));
  for i:=1 to n do begin
  writeln('Введите даные');
  readln(a.FIO,a.tel,a.god,a.kab,a.plt);
  write(f,a);
  seek(f,filesize(f)); end;
  Close(f); cht;
  end;
{---------чтение файла---------}
procedure cht;
var n:integer; {- количество записей в файле}
 begin
  writeln;
  writeln('чтение файла');
  Assign(f,'2.dat');
  reset(f); p:=' '; tabl;
  while not eof(f) do
  begin
  read(f,a);
  writeln;
  write(a.FIO,p,a.tel,p,a.god,p,a.kab,p,a.plt);  end;
  close(f);
  end;
{---------модификация файла--------}
procedure modif;
var nfio:string; nplt,n,i:integer;q:boolean;
 begin
   writeln;
   writeln ('модификация файла');
   Assign(f,'2.dat');
   writeln('сколько записей вы хотели бы редактировать:');
   readln(n);
   q:=false;
    for i:=1 to n do begin
      writeln('введите фамилию,записи о которой вы хотели бы редактировать');
      readln(nfio);
      reset(f);
        repeat
          read(f,a);
          if nfio=a.fio then begin
            q:=true;
            danzap;
            reset(f);
            seek(f,filepos(f)-1);
            writeln('введите новые данные');
            readln(a.tel,a.god,a.kab,a.plt);
            seek(f,filesize(f));
            write(f,a);
            seek(f,filesize(f));
            close(f);
          end else writeln('такая фамилия не найдена');
         until {eof(f);} q=true;
    end;
if q=false then writeln('такая фамилия не найдена');
write('после модификации файла:');cht;
end;
{-------------поиск записей файла---------------}
procedure poisk;
var  q:boolean;
begin
assign(f,'2.dat');
reset(f);
q:=false; writeln;
writeln('записи абонентов,имеющих задолженность или год установки до 1980 г.');
while not eof(f) do
      begin
      read(f,a);
      if (a.god<1980)or(a.plt<0) then
          begin
          q:=true;
          writeln;
          write(a.fio,' ',a.tel,' ',a.god,' ',a.kab,' ',a.plt);
          end;
      end;
if q=false then write('таких не найдено'); writeln;
close(f);
end;
{----------удаление записей из типизированного файла-----------}
procedure udalenie;
var nf:string;
    kol,i:longint;
begin
assign(f,'2.dat');
reset(f);
kol:=filesize(f);
writeln;
writeln('удаление данных');
writeln('введите фамилию абонента, запись о котором вы хотите удалить');
readln(nf);
repeat
read(f,a);
if nf=a.fio then begin
              writeln('запись удалена');
            if eof(f) then seek(f,kol-1) else
               for i:=filepos(f) to kol-1 do
                   begin
                   seek(f,i);read(f,a);
                   seek(f,i-1);write(f,a);
               end;
            truncate(f);
            exit;
            end;
               until eof(f);
               write('такой записи нет');
               close(f);
               end;
procedure povtor;
 begin
   writeln;
   writeln('----------------------------------------------------');
   writeln('для продолжения работы нажмите клавишу <Enter>');readln;
 end;
Begin
Clrscr;
l:writeln;
writeln('1 - создание файла');
writeln('2 - вывод шапки таблицы');
writeln('3 - запись данных в файл');
writeln('4 - дополнение файла');
writeln('5 - вывод данных одной записи');
writeln('6 - чтение данных файла');
writeln('7 - модификация ряда записей файла');
writeln('8 - поиск в файле');
writeln('9 - удаление записей файла');
writeln('0 - выход');
writeln('введите желаемое действие');
readln(k);
case k of
     1:begin sozd; povtor; goto l;end;
     2:begin tabl; povtor; goto l;end;
     3:begin zap; povtor; goto l;end;
     4:begin dop; povtor; goto l;end;
     5:begin danzap; povtor; goto l;end;
     6:begin cht; povtor; goto l;end;
     7:begin modif; povtor; goto l;end;
     8:begin poisk; povtor; goto l;end;
     9:begin udalenie; povtor; goto l;end;
     0:exit;
end;
readln;
End.