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

Автор работы: Пользователь скрыл имя, 11 Мая 2014 в 18:14, курсовая работа

Краткое описание

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

Содержание

Введение 4
1 Постановка задачи на разработку программы 5
2 Состав и структура исходных данных и результатов 6
3 Методы решения задач 7
4 Описание программы 8
5 Методика отладки программы 13
6 Руководство пользователя 14
Заключение 16
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ 17

Прикрепленные файлы: 1 файл

Пояснительная записка.docx

— 295.08 Кб (Скачать документ)

    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 – Схема алгоритма вывода графика на экран

 

Приложение В

 

 

 

 

 

 

 

 

 

 

Приложение В

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

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

 

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