Программа


Program DataBase;
{ База данных сотрудников }
Uses Crt;                                           { Подключение модуля Crt }
Type
  EducateType=(IncompletMiddle,Middle,MiddleSpecial,
               IncompletSuperior,Superior);              { Тип - образование }
  Collaborator=record                                      { Тип - сотрудник }
                 FamilyName:string[20];                            { Фамилия }
                 DataOfBorn:record                           { Дата рождения }
                              day:1..31;
                              month:1..12;
                              year:integer;
                            end;
                 Educate:EducateType;                          { Образование }
                 Post:word;                                      { Должность }
                 Salary:word;                                        { Оклад }
                 RecordOfService:byte;                                { Стаж }
                 Number:word                                         { Номер }
               end;
Var Exit:boolean;                                 { Флаг выхода из программы }
    Base:file of Collaborator;  { Файловая переменная записей типа сотрудник }
Procedure OutMenu;                                   { Процедура вывода меню }
  Begin
    ClrScr;                                                 { Очистка экрана }
    WriteLn('[ 1 ] - Создание файла сотрудников ');
    WriteLn('[ 2 ] - Вывод файла на экран ');
    WriteLn('[ 3 ] - Вывод файла на печать ');
    WriteLn('[ 4 ] - Получение числа сотрудников с высшим образованием ',
                     'и стажем >10 лет ');
    WriteLn('[ 5 ] - Вывод фамилии и оклада руководителя сектора',
                    ' с окладом >300 рублей ');
    WriteLn('[Esc] - Выход ');
    WriteLn;
    WriteLn('Для выбора пункта меню нажмите клавишу ')
  End;
Procedure OutBase(OutName:string);                   { Поцедура вывода файла }
  Var Buf:Collaborator;              { Буферная переменная для вывода записи }
      Out:text;                             { Файловая переменная типа текст }
  procedure WriteCollaborator(Buf:Collaborator);
                                     { Прцедура вывода записи типа сотрудник }
    begin
      with Buf do                        { Писоединение заголовка записи Buf }
        begin
          while Length(FamilyName)<20 do FamilyName:=FamilyName+' ';
                         { Выравнивание длины строки фамилии до полного поля }
          Write(Out,'│ ',FamilyName,' │ ');                  { Вывод фамилии }
          with DataOfBorn do Write(Out,day:2,'.',month:2,'.',year:2,' │ ');
                   { Присоединение подзаголовка записи и вывод даты рождения }
          case Educate of                           { Вывод поля образования }
            IncompletMiddle  :Write(Out,'неполное среднее    │ ');
            Middle           :Write(Out,'среднее             │ ');
            MiddleSpecial    :Write(Out,'среднее специальное │ ');
            IncompletSuperior:Write(Out,'неполное высшее     │ ');
            Superior         :Write(Out,'высшее              │ ')
          end;
          WriteLn(Out,Post:5,' │ ',Salary:4,' │ ',RecordOfService:4,' │');
                                       { Вывод полей: должность, оклад, стаж }
        end
    end;
  Begin {OutBase}
    Reset(Base);                                   { Открытие входного файла }
    Assign(Out,OutName);  { Связывание выходного файла с файловой переменной }
    Rewrite(Out);                                 { Открытие выходного файла }
    ClrScr;                                               { Очистка монитора }
    { Вывод шапки таблицы: }
    WriteLn(Out,'┌──────────────────────┬──────────┬───────────────────',
                '──┬───────┬──────┬──────┐');
    WriteLn(Out,'│      фамилия         │дата рожд.│     образование   ',
                '  │ дожн. │оклад │ стаж │');
    WriteLn(Out,'├──────────────────────┼──────────┼───────────────────',
                '──┼───────┼──────┼──────┤');
    while not EOF(Base) do                            { Цикл просмотра файла }
      begin
        Read(Base,Buf);                            { Чтение очередной записи }
        WriteCollaborator(Buf)                    { Вывод прочитанной записи }
      end;
    WriteLn(Out,'└──────────────────────┴──────────┴────────────────────',
                '─┴───────┴──────┴──────┘');           { Вывод конца таблицы }
    Close(Base);                                   { Закрытие входного файла }
    Close(Out);                                   { Закрытие выходного файла }
    if OutName='Con' then            { Если вывод производился на консоль, то}
      begin            { вывод приглашения нажать клавишу и ожидание нажатия }
        WriteLn;
        WriteLn('Для выхода в меню нажмите [Enter] ');
        ReadLn
      end
  End; {OutBase}
Procedure Make;                                    { Поцедура создания файла }
  Var Buf:Collaborator;               { Буферная переменная для ввода записи }
  function InputFlag:boolean;{ Функция определения флага ввода записей файла }
    var Ch:char;                               { Переменная для ввода ответа }
    begin
      ClrScr;                                             { Очистка монитора }
      WriteLn('Окончить ввод ? [Y,N] ');
                                   { Выдача запроса на окончание ввода файла }
      repeat                             { Цикл получения корректного ответа }
        Ch:=ReadKey                                      { Чтение клавиатуры }
      until Ch in ['Y','y','N','n'];
                           { Выход из цикла при получении корректного ответа }
      InputFlag:=Ch in ['N','n']                        { Определение ответа }
    end;
  function GetEducate:EducateType; { Функция ввода значения поля образования }
    var Ch:char;                               { Переменная для ввода ответа }
        i:byte;                                                    { Счетчик }
    begin                                                  { Вывод подсказки }
      WriteLn('Образование: [1] - неполное среднее    ');
      WriteLn('             [2] - среднее             ');
      WriteLn('             [3] - среднее специальное ');
      WriteLn('             [4] - неполное высшее     ');
      WriteLn('             [5] - высшее              ');
      repeat                    { Цикл ввода корректного ответа на подсказку }
        Ch:=ReadKey                                      { Чтение клавиатуры }
      until Ch in ['1'..'5'];
                           { Выход из цикла при получении правильного ответа }
      case Ch of       { Определение поля образования по ответу с клавиатуры }
        '1':GetEducate:=IncompletMiddle;
        '2':GetEducate:=Middle;
        '3':GetEducate:=MiddleSpecial;
        '4':GetEducate:=IncompletSuperior;
        '5':GetEducate:=Superior
      end;
      GoToXY(14,WhereY-5);      { Перевод курсора на первый символ подсказки }
       for i:=1 to 5 do begin           { Очистка экрана в области подсказки }
                          ClrEol;
                         { Очистка строки от позиции курсора до конца строки }
                          GoToXY(14,WhereY+1);
               { Перевод курсора на первый символ следующей строки подсказки }
                        end;
      GoToXY(14,WhereY-5);
                    { Возврат курсора на позицию вывода значения образования }
      case Ch of                                     { Эхо ввода образования }
        '1':WriteLn(' неполное среднее    ');
        '2':WriteLn(' среднее             ');
        '3':WriteLn(' среднее специальное ');
        '4':WriteLn(' неполное высшее     ');
        '5':WriteLn(' высшее              ')
      end
    end;
  Begin   {Make}
    Rewrite(Base);                          { Открытие файла базы для записи }
      while InputFlag do                      { Цикл, пока поднят флаг ввода }
        begin
          with Buf do                       { Присоединение заголовка записи }
            begin
              ClrScr;                                       { Очистка экрана }
              Write('Фамилия ');
              ReadLn(FamilyName);                             { Ввод фамилии }
              with DataOfBorn do         { Присоединение подзаголовка записи }
                begin                                   { Ввод даты рождения }
                  Write('Дата рождения - число ');
                  ReadLn(day);
                  Write('              - месяц ');
                  ReadLn(month);
                  Write('              - год   ');
                  ReadLn(year);
                end;
              Educate:=GetEducate;                   { Ввод поля образования }
              Write('Код должности ');
              ReadLn(Post);                                 { Ввод должности }
              Write('Оклад ');
              ReadLn(Salary);                                  { Ввод оклада }
              Write('Стаж ');
              ReadLn(RecordOfService);                          { Ввод стажа }
              Write('Номер ');
              ReadLn(Number)                                   { Ввод номера }
            end;
          Write(Base,Buf)              { Запись в файл базы очередной записи }
        end;
    Close(Base)                                        { Закрытие файла базы }
  End;  {Make}
Procedure GetCollaboratorQuantity; { Процедура получения и вывода количества
                          сотрудников с высшим образованием и стажем >10 лет }
  var Quantity:word;                   { Переменная для подсчета сотрудников }
      Buf:Collaborator;              { Буферная переменная для чтения записи }
  Begin
    Quantity:=0;    { Обнуление переменной перед подсчетом числа сотрудников }
    Reset(Base);                            { Открытие файла базы для чтения }
    while not EOF(Base) do                                  { Просмотр файла }
      begin
        Read(Base,Buf);                            { Чтение очередной записи }
        with Buf do                         { Присоединение заголовка записи }
          if (Educate=Superior)and(RecordOfService>10)
            { Если данный сотрудник имеет высшее образование и стаж >10 лет ,}
            then Quantity:=Quantity+1 { то увеличение числа сотрудников на 1 }
      end;
    Close(Base);                                       { Закрытие файла базы }
    ClrScr;                                                 { Очистка экрана }
    WriteLn('Количество сотрудников с высшим образованием и стажем >10 лет ',
             Quantity);         { Вывод подсчитанного количества сотрудников }
    WriteLn;                                 { Вывод приглашения нажать ВВОД }
    WriteLn('Для выхода в меню нажмите [Enter] ');
    ReadLn                     { Остановка программы до нажатия клавиши ВВОД }
  End;
Procedure OutFamilyName;    { Процедура вывода фамилии и оклада руководителей
                              сектора с окладом >300 рублей }
  var Buf:Collaborator;              { Буферная переменная для чтения записи }
  Begin
    Reset(Base);                            { Открытие файла базы для чтения }
    ClrScr;                           { Очистка экрана и вывод шапки таблицы }
    WriteLn('┌──────────────────────┬──────┐');
    WriteLn('│      фамилия         │ оклад│');
    WriteLn('├──────────────────────┼──────┤');
    while not EOF(Base) do                            { Цикл просмотра файла }
      begin
        Read(Base,Buf);                   { Чтение очередной записи из файла }
        with Buf do                         { Присоединение заголовка записи }
          if (Post div 1000 =14)and(Salary>300) then
                               { Если элемент файла относится к руководителю
                                           сектора с окладом >300 рублей, то }
            begin
              while Length(FamilyName)<20 do FamilyName:=FamilyName+' ';
                                 { выравнивание длины фамилии до 20 символов }
              WriteLn('│ ',FamilyName,' │ ',Salary:4,' │')
                                     { вывод в таблицу полей фамилия и оклад }
            end
      end;
    WriteLn('└──────────────────────┴──────┘'); { Вывод нижней части таблицы }
    Close(Base);                                       { Закрытие файла базы }
    WriteLn;
    WriteLn('Для выхода в меню нажмите [Enter] '); { Приглашение нажать ВВОД }
    ReadLn                            { Остановка программы до нажатия ВВОДа }
  End;
BEGIN
  Exit:=false;                                          { Сброс флага выхода }
  Assign(Base,'DataBase');   { Связывание файловой переменной с именем файла }
  repeat
    OutMenu;                                                    { Вывод меню }
    case ReadKey of                       { Выбор действия по ответу на меню }
      '1':Begin
            Make;                                            { Создание базы }
            OutBase('Con')                           { Вывод базы на монитор }
          End;
      '2':OutBase('Con');                            { Вывод базы на монитор }
      '3':OutBase('Prn');                            { Вывод базы на принтер }
      '4':GetCollaboratorQuantity;
          { Подсчет числа сотрудников с высшим образованием и стажем >10 лет }
      '5':OutFamilyName;
      { Вывод фамилий и окладов руководителей секторов с окладом >300 рублей }
      #27:Exit:=true                                   { Подъем флага выхода }
    end
  until Exit
END.

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