Использование динамических списков-сотрудники

Титульный лист

 

Лист задания

 

Содержание

 

 

 

Введение

Язык программирования «Pascal» был разработан Н. Виртом первоначально для целей обучения программированию вообще. С этой точки зрения Паскаль имеет некоторое преимущество перед однотипными языками - такими, как, например, язык Си.

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

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

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

 

1 Постановка задачи на разработку программы

 

Необходимо разработать программу, выполняющую следующие функции:

– ввод данных,

– запись данных в файл,

– чтение данных из файла,

– вывод данных на экран,

– дополнение данных,

– удаление данных,

– сортировка данных,

– построение диаграммы по данным из файла и вывод ее на экран.

Для сортировки данных и построения диаграммы использовать вычисляемое поле (можно выполнять сортировку дополнительно по любому другому полю по усмотрению разработчика).

 

 

2 Состав и структура исходных данных и результатов

 

Для хранения штатного расписания в оперативной памяти и в файле используется тип записи со структурой, представленной в таблице 1.

Таблица 1 – Состав и структура исходных данных

Имя переменной

Назначение

Тип

Ограничения

Num

Штатный номер сотрудника

Integer

От 0 до 32767

FIO

ФИО сотрудника

String

Не более 255 символов

WORK

Должность сотрудника

String

Не более 255 символов

OKL

Оклад сотрудника

Real

>0

Perc

Процент надбавки для сотрудника

Real

>0


 

 

3 Методы решения задач

 

Для сортировки списка сотрудника используется вычисляемое поле «Заработная плата», которое вычисляется по формуле:

.

Для выполнения сортировки используется сортировка методом «пузырька». Данный метод выполняется в цикле, пока происходит обмен элементов. Условием выхода из цикла является отсутствие перестановок. Так как производится проход по односвязному списку, то для уменьшения количества обращений обмен элементов производится путем обмена информационной части найденного указателя и следующего элемента с использованием промежуточных переменных.

Вывод диаграммы на экран осуществляется с помощью стандартных функций графической подсистемы, предоставляемых модулем Graph.

 

4 Описание программы

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

В файле исходного текста основной программы осуществляется подключение разработанного модуля и вызов процедуры «меню»:

program kr;

uses m_unit;

begin

  menu;

  clear_s;

end.

 

В модуле «m_unit» описаны следующие процедуры:

  • procedure menu   ;
  • procedure init_s ;
  • procedure new_s  ;
  • procedure view_s ;
  • procedure del_s  ;
  • procedure get_s  ;
  • procedure out_s  ;
  • procedure draw_s ;
  • procedure sort_s ;
  • procedure clear_s;
  • procedure show_s.

Процедура menu осуществляет вывод на экран пунктов меню и предоставляет пользователю выбор действия. Выбор пользователя осуществляется нажатием функциональных клавиш:

procedure menu;

var

  ch:Char;

begin

  Init_s;

  repeat

    textcolor(11);  

    TextBackground(1);  

    clrscr;

   

    writeln('F1.Новый  F2.Просмотр F3.Удалить F4.Диаграмма F5.Открыть F6.Сохранить ESC-Выход');

    ch :=ReadKey;

    if (ch=#27) then exit;

    if (ch = #0) then

    begin

      ch :=ReadKey;

    end;

    case ch of

      #59:new_s  ;

      #60:view_s ;

      #61:del_s  ;

      #62:draw_s ;

      #63:get_s  ;

      #64:out_s  ;

    end;

  until ch = #27;

end;

 

Для добавления элемента в список в ручном режиме используется процедура new_s. Работа с указателями построена таким образом, что добавление нового сотрудника осуществляется в конец списка. Ввод информационной части указателя происходит в диалоговом режиме с выводом подсказок о заполняемом значении. После ввода информации осуществляется показ введенной информации в табличном виде.

procedure new_s;  {Процедура добавления сотрудника в список}

var

  tmp,ends:m_rec;

begin

  clrscr;

  textcolor(10); {зел цвет}

  if Head = Nil then

  begin

    new(head);

    head^.next := NIL;

    tmp := head;

  end

  else

  begin

    tmp := Head;

    while (tmp^.Next<>NIL) do

    begin

      tmp := tmp^.Next;

    end;

    ends:=tmp;

    new(tmp);

    ends^.next := tmp;

    tmp^.Next := NIL;

  end;

{Заполним поля структуры} 

  { Num  :Integer;

    FIO  :string;

    WORK :string;

    OKL  :real;

    Perc :real;

  }

 

  write('Номер сотрудника:');

  readln(tmp^.Num);

  write('ФИО:');

  readln(tmp^.FIO);

  write('Должность:');

  readln(tmp^.Work);

  write('Оклад:');

  readln(tmp^.OKL);

  write('Надбавка(%):');

  readln(tmp^.Perc);

 

  { Для автотестов}

  {  tmp^.Num  :=1;  

    tmp^.FIO  := 'asdasd';

    tmp^.WORK := '123aasdsdasd';

    tmp^.OKL  :=123;

    tmp^.Perc :=1;

  }

 

 

  textcolor(14);  

  writeln('Добавлена запись:');

  textcolor(10);  

 

{Шапка} 

  writeln('╔════╦════════════════════╦════════════════════╦════════╦═════╦════════╗');

  textcolor(10);  

  write('║');textcolor(13);write(' N  ');

  textcolor(10);

  write('║');textcolor(13);write(' ФИО сотрудника     ');

  textcolor(10);

  write('║');textcolor(13);write('    Должность       ');

  textcolor(10);

  write('║');textcolor(13);write('  Оклад ');

  textcolor(10);

  write('║');textcolor(13);write('  %  ');

  textcolor(10);

  write('║');textcolor(13);write('  ЗП    ');

  textcolor(10);

  writeln('║');

 

 

 

{вывод текущей записи}   

  writeln('╠════╬════════════════════╬════════════════════╬════════╬═════╬════════╣');

  textcolor(10);  

  write('║');textcolor(15);write(tmp^.num:4);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.FIO:20);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.Work:20);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.OKL:8:2);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.Perc:5:2);

  textcolor(10);

  write('║');textcolor(15);write((tmp^.OKL*(1+0.01*tmp^.Perc)):8:2);

  textcolor(10);

  writeln('║');

 

 

{подвал} 

  writeln('╚════╩════════════════════╩════════════════════╩════════╩═════╩════════╝');

 

  textcolor(11);  

 

  write('Для продолжения нажмите любую клавишу');

  readkey;

 

end;

 

Процедура сортировки sort_s осуществляет проход по списку со сравнением текущего элемента и следующего. Сравнение происходит по вычисляемому полю «Заработная плата». Если данное поле у текущего элемента больше, чем у следующего, то происходит обмен информационными частями между указателями. Проход списка с целью сортировки осуществляется до тех пор, пока имеются перестановки. Если после прохода не было перестановок, цикл завершается и список считается отсортированным.

procedure sort_s; {Процедура сортировки списка по ЗП}

var

  t1,t2:m_rec;

  HaveChange:boolean;

  Num  :Integer;

  FIO  :string;

  WORK :string;

  OKL  :real;

  Perc :real;

begin

 

  HaveChange:=true;

  while HaveChange do

  begin

    HaveChange:=false;

    t1:=head;

    while t1^.next<>nil do

    begin

      t2:=t1^.next;

      if ((t1^.OKL*(1+0.01*t1^.Perc)) > (t2^.OKL*(1+0.01*t1^.Perc))) then

      begin

        HaveChange:=true;

       

        Num  := t1^.NUM;

        FIO  := t1^.FIO;

        WORK := t1^.WORK;

        OKL  := t1^.OKL;

        Perc := t1^.Perc;

       

        t1^.NUM:=t2^.NUM;;

        t1^.FIO:=t2^.FIO;;

        t1^.WORK:=t2^.WORK;

        t1^.OKL:=t2^.OKL;

        t1^.Perc:=t2^.Perc;

       

        t2^.NUM:=NUM;;

        t2^.FIO:=FIO;;

        t2^.WORK:=WORK;

        t2^.OKL:=OKL;

        t2^.Perc:=Perc;

       

      end;

      t1:=t1^.next;

    end;

 

  end;

end;

 

Полный текст программы приведен в приложении А.

Схема алгоритма программы приведена в приложении Б.

 

5 Методика отладки программы

 

В результате выполнения работы была написана программа для ведения штатного расписания сотрудников. Для тестирования был подготовлен исходный набор данных. Выполнение программы показало корректную работу.

Результаты тестирования приведены в приложении В.

 

6 Руководство пользователя

 

При запуске программы пользователь видит на экране горизонтальное меню выбора действий. Выбор пункта меню осуществляется при помощи функциональных клавиш F1-F6, выход из программы осуществляется по нажатию клавиши «ESC» (см. рисунок 1).

Рисунок 1 – Окно программы при старте.

Для оперирования информацией о сотрудниках используются клавиши:

  • F1. Добавление сотрудника в список;
  • F2. Просмотр списка сотрудников;
  • F3. Удаление сотрудника из списка.

При добавлении нового сотрудника на экран выводится подсказка о вводимой информации. После ввода всех полей на экран выводится в табличном виде внесенная информация (см. рисунок 2).

Рисунок 2 – Добавление нового сотрудника.

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

 

Заключение

 

В результате выполнения курсового проекта была разработана программа введения штатного расписания сотрудников и подготовлена документация на разработанное программное обеспечение. Проведенное тестирование показало корректность работы программы.

 

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

1. Климова Л.М. PASCAL 7.0 Практическое программирование. Решение типовых задач. - М.: КУДИЦ-ОБРАЗ, 2000.

2. Абрамов С.А., Зима Е.В. Начала программирования на языке Паскаль. -М.: Наука, 1987.

3. Аладьев В.З., Тупало В.Г. Turbo-Pascal для всех. - Киев: Технiка, 1993.

4. Белецкий, Ян. Турбо Паскаль с графикой для персональных компьютеров. - М.: Машиностроение, 1991.

5. Джонс Ж., Харроу К. Решение задач с системой Турбо Паскаль. -М.: Финансы и статистика, 1991.

6. Епанешников А.М. Программирование в среде Turbo Pascal 7.0. -М.: Диалог-МИФИ, 1996.

7. Климов Ю.С. Программирование в среде Turbo-Pascal 6.0. - Мн.: выш. шк., 1992.

8. Сергиевский М.В. Язык, среда программирования. - М.: Машиностроение, 1994.

9. Турбо Паскаль 7.0. -Киев: торгово-издательское бюро BHV, 1995.

10. Фаронов В.В. Турбо Паскаль 7.0. начальный курс. - М.: "Нолидж", 1997.

11. Фаронов В.В. Турбо Паскаль 7.0. Практика программирования. - М.: "Нолидж", 1997.

 

Приложение А

 

 

 

 

 

 

 

Приложение А

(обязательное)

Исходный текст программы

 

program kr;

uses m_unit,crt;

begin

  menu;

  clear_s;

end.

 

unit m_unit;

 

interface

 

type

 

  m_rec = ^my_record;

  my_record = record

    Num  :Integer;

    FIO  :string;

    WORK :string;

    OKL  :real;

    Perc :real;

    Next  :m_rec;

  end;

 

procedure menu   ; {Процедура вывода меню}

procedure init_s ; {Процедура производит при старте заполнение начальных параметров}

procedure new_s  ; {Процедура добавления сотрудника в список}

procedure view_s ; {Процедура просмотра списка сотрудников}

procedure del_s  ; {Процедура удаления сотрудника из списка}

procedure get_s  ; {Процедура загрузки списка сотрудников из файла}

procedure out_s  ; {Процедура сохранения списка в файл}

procedure draw_s ; {Процедура вывода диаграммы на экран}

procedure sort_s ; {Процедура сортировки списка по ЗП}

procedure clear_s; {Процедура очищает список}

procedure show_s ; {Процедура прорисовки диаграммы}

var

  Head:m_rec;      {Указатель на начало списка}

  SeekFil:string;  {Имя текущего файла}

implementation

 

uses crt,graph;

procedure init_s; {Процедура производит при старте заполнение начальных параметров}

begin

  Head:=NIL;      {Список иначально пуст}

  SeekFil:='New.bin';

end;

 

procedure menu;

var

  ch:Char;

begin

  Init_s;

  repeat

    textcolor(11);  

    TextBackground(1);  

    clrscr;

   

    writeln('F1.Новый  F2.Просмотр F3.Удалить F4.Диаграмма F5.Открыть F6.Сохранить ESC-Выход');

    ch :=ReadKey;

    if (ch=#27) then exit;

    if (ch = #0) then

    begin

      ch :=ReadKey;

    end;

    case ch of

      #59:new_s  ;

      #60:view_s ;

      #61:del_s  ;

      #62:draw_s ;

      #63:get_s  ;

      #64:out_s  ;

    end;

  until ch = #27;

end;

{*******************************************************************}

procedure out_str(n:integer;s:string);

var

 ii:integer;

 jj:integer;

begin

  if (length(s) > n) then

  begin

    for ii:=1 to n do

    begin

      write(s[ii]);

    end;

  end

  else

  begin

    JJ:=0;

    for ii:=1 to Length(s) do

    begin

       write(s[ii]);

       inc(jj);

    end;

    for ii:=jj to n do

    begin

      write(' ');

    end;

  end;

end;

{*******************************************************************}

procedure new_s;  {Процедура добавления сотрудника в список}

var

  tmp,ends:m_rec;

begin

  clrscr;

  textcolor(10); {зел цвет}

  if Head = Nil then

  begin

    new(head);

    head^.next := NIL;

    tmp := head;

  end

  else

  begin

    tmp := Head;

    while (tmp^.Next<>NIL) do

    begin

      tmp := tmp^.Next;

    end;

    ends:=tmp;

    new(tmp);

    ends^.next := tmp;

    tmp^.Next := NIL;

 

  end;

{Заполним поля структуры} 

  { Num  :Integer;

    FIO  :string;

    WORK :string;

    OKL  :real;

    Perc :real;

  }

 

  write('Номер сотрудника:');

  readln(tmp^.Num);

  write('ФИО:');

  readln(tmp^.FIO);

  write('Должность:');

  readln(tmp^.Work);

  write('Оклад:');

  readln(tmp^.OKL);

  write('Надбавка(%):');

  readln(tmp^.Perc);

 

  { Для автотестов}

  {  tmp^.Num  :=1;  

    tmp^.FIO  := 'asdasd';

    tmp^.WORK := '123aasdsdasd';

    tmp^.OKL  :=123;

    tmp^.Perc :=1;

  }

 

 

  textcolor(14);  

  writeln('Добавлена запись:');

  textcolor(10);  

 

{Шапка} 

  writeln('╔════╦════════════════════╦════════════════════╦════════╦═════╦════════╗');

  textcolor(10);  

  write('║');textcolor(13);write(' N  ');

  textcolor(10);

  write('║');textcolor(13);write(' ФИО сотрудника     ');

  textcolor(10);

  write('║');textcolor(13);write('    Должность       ');

  textcolor(10);

  write('║');textcolor(13);write('  Оклад ');

  textcolor(10);

  write('║');textcolor(13);write('  %  ');

  textcolor(10);

  write('║');textcolor(13);write('  ЗП    ');

  textcolor(10);

  writeln('║');

 

 

 

{вывод текущей записи}   

  writeln('╠════╬════════════════════╬════════════════════╬════════╬═════╬════════╣');

  textcolor(10);  

  write('║');textcolor(15);write(tmp^.num:4);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.FIO:20);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.Work:20);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.OKL:8:2);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.Perc:5:2);

  textcolor(10);

  write('║');textcolor(15);write((tmp^.OKL*(1+0.01*tmp^.Perc)):8:2);

  textcolor(10);

  writeln('║');

 

 

{подвал} 

  writeln('╚════╩════════════════════╩════════════════════╩════════╩═════╩════════╝');

 

  textcolor(11);  

 

  write('Для продолжения нажмите любую клавишу');

  readkey;

 

end;

{*******************************************************************}

{Процедура добавления  сотрудника в список из файла}

procedure new_sf(Num  :Integer; FIO  :string; WORK :string;  OKL  :real;  Perc :real); 

var

  tmp,ends:m_rec;

begin

  clrscr;

  textcolor(10); {зел цвет}

  if Head = Nil then

  begin

    new(head);

    head^.next := NIL;

    tmp := head;

  end

  else

  begin

    tmp := Head;

    while (tmp^.Next<>NIL) do

    begin

      tmp := tmp^.Next;

    end;

    ends:=tmp;

    new(tmp);

    ends^.next := tmp;

    tmp^.Next := NIL;

  end;

{Заполним поля структуры} 

 

    tmp^.Num  := NUM;

    tmp^.FIO  := FIO;

    tmp^.WORK := WORK;

    tmp^.OKL  := OKL;

    tmp^.Perc := Perc;

end;

 

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

procedure view_s; {Процедура просмотра списка сотрудников}

var

  tmp:m_rec;

begin

 clrscr;

 textcolor(10);

{Шапка} 

  writeln('╔════╦════════════════════╦════════════════════╦════════╦═════╦════════╗');

  textcolor(10);  

  write('║');textcolor(13);write(' N  ');

  textcolor(10);

  write('║');textcolor(13);write(' ФИО сотрудника     ');

  textcolor(10);

  write('║');textcolor(13);write('    Должность       ');

  textcolor(10);

  write('║');textcolor(13);write('  Оклад ');

  textcolor(10);

  write('║');textcolor(13);write('  %  ');

  textcolor(10);

  write('║');textcolor(13);write('  ЗП    ');

  textcolor(10);

  writeln('║');

 

  tmp :=head;

  while (tmp<> NIL) do

  begin

{вывод текущей записи}   

  writeln('╠════╬════════════════════╬════════════════════╬════════╬═════╬════════╣');

  textcolor(10);  

  write('║');textcolor(15);write(tmp^.num:4);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.FIO:20);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.Work:20);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.OKL:8:2);

  textcolor(10);

  write('║');textcolor(15);write(tmp^.Perc:5:2);

  textcolor(10);

  write('║');textcolor(15);write((tmp^.OKL*(1+0.01*tmp^.Perc)):8:2);

  textcolor(10);

  writeln('║');

 

  tmp := tmp^.next;

  end;

 

{подвал} 

  writeln('╚════╩════════════════════╩════════════════════╩════════╩═════╩════════╝');

 

  textcolor(11);  

 

  write('Для продолжения нажмите любую клавишу');

  readkey;

 

 

end;

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

procedure get_s;  {Процедура загрузки списка сотрудников из файла}

var

  ch:char;

  f :file of my_record;

  s :string;

  tmp:my_record;

begin

  clrscr;

  textcolor(15);

  if head <> NIL then

  begin

    writeln('При загрузке файла с диска может произойти потеря текущего списка');

    writeln('Выберите действие:');

    writeln('  - Enter - продолжить, не сохраняя;');

    writeln('  - ESC   - сохранить текущий список и продолжить.');

   

    repeat

      ch:=readkey;

    until ((ch =#27) or (ch = #13));

   

    if (ch = #27) then

    begin

      out_s;  {Сохранить текущий список}

    end;

  end;

 

  clear_s; {Процедура очищает список}

  {далее загрузка данных}

  textcolor(10);

  write('Имя файла для открытия:');

  textcolor(11);

  readln(s);

  assign(f,s);

  {$I-}   {// Отключаем контроль ввода/вывода}

  RESET(F);

  {$I+}   {// Включаем  контроль ввода/вывода}

  if IOResult <> 0  {// Выход, если файл не открыт}

  then

  begin

    textcolor(12);

    writeln ('Невозможно открыть файл');

  end

  else

  begin

    SeekFil:=s;

    while (not EOF(f)) do

    begin

      read(f,tmp);

      new_sf(tmp.Num, tmp.FIO,tmp.WORK, tmp.OKL,tmp.Perc);

    end;

    Close(f);

  end;

 

  textcolor(10);

  write('Для продолжения нажмите любую клавишу');

  readkey;

  sort_s;

end;

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

procedure out_s;  {Процедура сохранения списка в файл}

var

  s:string;

  f :file of my_record;

  tmp:my_record;

  t:m_rec;

 

begin

  if SeekFil = 'New.bin' then

  begin

    textcolor(10);

    write('Имя файла:');

    textcolor(11);

    readln(s);

  end

  else

  begin

    s:=SeekFil;

  end;

  assign(f,s);

  {$I-}   { Отключаем контроль ввода/вывода}

  REWRITE(F);

  {$I+}   { Включаем контроль ввода/вывода}

  if IOResult <> 0  {Выход, если файл не создан}

  then

  begin

    textcolor(12);

    writeln ('Невозможно сохранить файл');

  end

  else

  begin

    SeekFil:=s;

    t:=head;

    while (t<>NIL) do

    begin

      tmp.Num  := t^.NUM;

      tmp.FIO  := t^.FIO;

      tmp.WORK := t^.WORK;

      tmp.OKL  := t^.OKL;

      tmp.Perc := t^.Perc;

      write(f,tmp);

      t:=t^.next;

    end;

    Close(f);

  end;

 

  textcolor(10);

  write('Для продолжения нажмите любую клавишу');

  readkey;

 

end;

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

procedure sort_s; {Процедура сортировки списка по ЗП}

var

  t1,t2:m_rec;

  HaveChange:boolean;

  Num  :Integer;

  FIO  :string;

  WORK :string;

  OKL  :real;

  Perc :real;

begin

 

  HaveChange:=true;

  while HaveChange do

  begin

    HaveChange:=false;

    t1:=head;

    while t1^.next<>nil do

    begin

      t2:=t1^.next;

      if ((t1^.OKL*(1+0.01*t1^.Perc)) > (t2^.OKL*(1+0.01*t1^.Perc))) then

      begin

        HaveChange:=true;

       

        Num  := t1^.NUM;

        FIO  := t1^.FIO;

        WORK := t1^.WORK;

        OKL  := t1^.OKL;

        Perc := t1^.Perc;

       

        t1^.NUM:=t2^.NUM;;

        t1^.FIO:=t2^.FIO;;

        t1^.WORK:=t2^.WORK;

        t1^.OKL:=t2^.OKL;

        t1^.Perc:=t2^.Perc;

       

        t2^.NUM:=NUM;;

        t2^.FIO:=FIO;;

        t2^.WORK:=WORK;

        t2^.OKL:=OKL;

        t2^.Perc:=Perc;

       

      end;

      t1:=t1^.next;

    end;

 

  end;

end;

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

procedure del_s;  {Процедура удаления сотрудника из списка}

var

  t1,t2:m_rec;

  num:integer;

begin

  clrscr;

  textcolor(10);

  write('Номер сотрудника:');

  textcolor(13);

  readln(num);

  textcolor(10);

  t1:=head;

  t2:=head;

  while(t1<>nil) do

  begin

    if t1^.num = num then

    begin

      if t1 = head then

      begin

        if t1^.Next = NIL then

        begin

          dispose(head);

          head := NIL;

          break;

        end

        else

        begin

          head := t1^.next;

          dispose(t1);

         

        end

      end

      else

      begin

        if t1^.next <> NIL then

        begin

          t2^.Next:=t1^.next;

          dispose(t1);

          t1:=t2;

        end

        else

        begin

          t2^.next:=Nil;

          dispose(t1);

          t1:=t2;

        end;

      end;

     

    end; 

    t2:=t1;

    if t1<> NIL then

    begin

      t1:=t1^.next;

    end;

  end;

  write('Для продолжения нажмите любую клавишу');

  readkey;

 

end;

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

procedure clear_s; {Процедура очищает список}

var

  tmp:m_rec;

begin

  tmp:=Head;

  while (tmp<>NIL) do

  begin

    Head:=tmp^.next;

    dispose(tmp);

    tmp:=Head;

  end;

  head := NIL;

end;

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

 

function InitGraf:Integer;   {функция инициализирует графический режим}

var

  CodeError:Integer;         {0 - Нет ошибок. Или код ошибки}

  gd,gm:integer;        {Драйвер и режим}

begin

  CodeError:= 0;       {Первичная инициализация, предполагается что все пройдет без ошибок}

  gd:=detect;

  InitGraph(gd,gm,'');

  If GraphResult <> grOk then

  begin

    CodeError :=GraphResult;     {Возвращается код ошибок}

  end

  else

  begin

    CodeError := 0;               {Возвращается 0, ошибок нет}

  end;

  InitGraf:=CodeError;

end;

 

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

 

procedure draw_s; {Процедура вывода диаграммы на экран}

begin

  clrscr;

  if InitGraf = 0 then

  begin

    Show_s;

    CloseGraph;

  end

  else

  begin

    textcolor(12);

    writeln('Ошибка инициализации видеодрайвера');

    readkey;

  end;

 

 

end;

{*******************************************************************}

{*******************************************************************}

{*******************************************************************}

 

procedure show_s; {Процедура прорисовки диаграммы}

var

  cnt: Integer;

  tmp: m_rec;

  Ht : integer; {высота экрана}

  Wt : integer; {Ширина экрана}

  i  : integer;

  mx : real   ; {Максимальная ЗП}

  ZmY: real   ; {Масштаб по Y}

  ZmX: real   ; {Масштаб по X}

  x0,y0:integer;

  ZP:real;

  s: string;

begin

  cnt:=0;

  mx:=0;

  wt:=GetMaxX;

  Ht:=GetMaxY;

  tmp:=head;

  while (tmp<>NIL) do

  begin

    inc(cnt);

    if ((tmp^.OKL*(1+0.01*tmp^.Perc))>mx) then

       mx:=(tmp^.OKL*(1+0.01*tmp^.Perc));

    tmp:= tmp^.next;

  end;

  if mx<>0 then ZmY:= ht/mx

    else ZmY:=1;

  moveto(0,ht);

  tmp:=head;

  if cnt<>0 then ZmX:=Wt/Cnt

  else ZmX:=1;

  i:=1;

  x0:=0;

  y0:=ht;

  while (tmp<>NIL) do

  begin

    ZP:=(tmp^.OKL*(1+0.01*tmp^.Perc));

    lineto(x0,Ht-trunc(ZP*ZmY));

    lineto(x0+trunc(ZmX),Ht-trunc(ZP*ZmY));

    lineto(x0+trunc(ZmX),Ht);

    X0:=x0+trunc(ZmX);

    tmp:= tmp^.next;

  end;

 

  {Рисуем ось ЗП и  подписываем ее}

  moveto(0,ht);

  setcolor(10);

  lineto(0,0);

  SetTextStyle(1, HorizDir, 1);

  outtextXY(1,10,'ZP 1234567890');

  for i:=1 to 5 do

  begin

    moveto(0,i*trunc(ht/5));

    lineto(5,i*trunc(ht/5));

    x0:=trunc(mx/(6-i));

    str(x0,s);

    outtext(s);

  end;

  readkey;

end;

 

end.

 

Приложение Б

 

 

 

 

 

 

 

 

 

Приложение Б

(обязательное)

Схема алгоритма программы

 

Рисунок Б.1 – Схема алгоритма главной программы

 

Рисунок Б.2 – Схема алгоритма процедуры сортировки

 

Рисунок Б.3 – Схема алгоритма вывода графика на экран

 

Приложение В

 

 

 

 

 

 

 

 

 

 

Приложение В

(обязательное)

Результаты тестирования