Программа


{
  Формат текстового файла:
  -одна строка одна запись
  -поля отделяются одним пробелом
  -отсутствие телефона опредилить прочерком
  
  Для всех операций, кроме ввода из текстового
  файла, файл 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 Необходимо разработать режимы работы: 
 а)Создание исходного файла(подпрограмма или кусок работы) 
 б)Просмотр файла(не выходя из программы) 
 в)создание результ. файла 
 г)Добавление новых записей 
 д)Удаление записей 
 ж)Упорядочивание записей  
}

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию