Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
laby.doc
Скачиваний:
2
Добавлен:
26.11.2018
Размер:
598.53 Кб
Скачать

Текст программы

program Lab5;

{$APPTYPE CONSOLE}

uses SysUtils;

type

Worker=record

Name:string;

Days:Integer;

Salary,Pay:Real;

end;

var

Days:Integer;

W:array [0..1000] of Worker;

n:Integer;

Total:Real;

procedure Load(const Name:string);

var

F:Text;

begin

Assign(F,Name);

Reset(F);

Readln(F,Days);

n:=0;

while not Eof(F) do

begin

Inc(n);

Readln(F,W[n].Name);

Readln(F,W[n].Days,W[n].Salary);

end;

Close(F);

Writeln('Считано строк: ',n);

end;

procedure Calc;

var

i:Integer;

begin

Total:=0;

for i:=1 to n do

begin

W[i].Pay:=Round(W[i].Salary*W[i].Days/Days*100) /100;

Total:=Total+W[i].Pay;

end;

end;

procedure Save(const Name:string);

var

F:Text;

i:Integer;

begin

Assign(F,Name);

Rewrite(F);

Writeln(F,'+-------…-------+---+---…---+---…----+');

Writeln(F,'| Фамилия |Дни| Оклад |Зарплата|');

Writeln(F,'+-------…-------+---+---…---+---…----+');

for i:=1 to n do

Writeln(F,'|',W[i].Name,'':40-Length(W[i].Name), '|',W[i].Days:3,'|',W[i].Salary:10:2, '|',W[i].Pay:10:2,'|');

Writeln(F,'+-------…-------+---+---…---+---…----+');

Writeln(F,'|Итого |', Total:10:2,'|');

Writeln(F,'+-------…-------+---+---…---+---…----+');

Close(F);

end;

procedure SortByName;

var

Stop:Boolean;

Last,Cmp,i:Integer;

Temp:Worker;

begin

Last:=n;

Cmp:=0;

repeat

Stop:=True;

Dec(Last);

for i:=1 to Last do

begin

Inc(Cmp); {Подсчет количества сравнений}

if W[i].Name>W[i+1].Name then

begin

Temp:=W[i];

W[i]:=W[i+1];

W[i+1]:=Temp;

Stop:=False;

end;

end;

until Stop;

Writeln('Сравнений при сортировке по имени: ',Cmp);

end;

procedure SortByPay;

var

Stop:Boolean;

Last,Cmp,i:Integer;

Temp:Worker;

begin

Last:=n;

repeat

Stop:=True;

Dec(Last);

for i:=1 to Last do

begin

Inc(Cmp); {Подсчет количества сравнений}

if W[i].Pay>W[i+1].Pay then

begin

Temp:=W[i];

W[i]:=W[i+1];

W[i+1]:=Temp;

Stop:=False;

end;

end;

until Stop;

Writeln('Сравнений при сортировке по зарплате:',Cmp);

end;

begin

Load('Workers.txt');

Calc;

Save('Pay.txt');

SortByName;

Save('ByName.txt');

SortByPay;

Save('ByPay.txt');

Readln; {Задержка для консольных приложений}

end.

Тест

Исходный файл со списком работников и информацией о заработной плате Workers.txt:

24

Петров

15 6300

Иванов

24 5600

Сидоров

19 4350

Николаев

15 4800

Малышев

21 4350

Соколов

12 7800

Расчет зарплаты и выгрузка файла «Pay.txt»:

+---------------------------+---+----------+----------+

| Фамилия |Дни| Оклад | Зарплата |

+---------------------------+---+----------+----------+

|Петров | 15| 6300.00| 3937.50|

|Иванов | 24| 5600.00| 5600.00|

|Сидоров | 19| 4350.00| 3443.75|

|Николаев | 15| 4800.00| 3000.00|

|Малышев | 21| 4350.00| 3806.25|

|Соколов | 12| 7800.00| 3900.00|

+---------------------------+---+----------+----------+

|Итого | 23687.50|

+------------------------------------------+----------+

Зарплата рассчитана корректно.

Сортировка списка по алфавиту и выгрузка файла «ByName.txt»:

+---------------------------+---+----------+----------+

| Фамилия |Дни| Оклад | Зарплата |

+---------------------------+---+----------+----------+

|Иванов | 24| 5600.00| 5600.00|

|Малышев | 21| 4350.00| 3806.25|

|Николаев | 15| 4800.00| 3000.00|

|Петров | 15| 6300.00| 3937.50|

|Сидоров | 19| 4350.00| 3443.75|

|Соколов | 12| 7800.00| 3900.00|

+---------------------------+---+----------+----------+

|Итого | 23687.50|

+------------------------------------------+----------+

Сортировка выполнена корректно.

Сортировка списка по зарплате и выгрузка файла «ByPay.txt»:

+---------------------------+---+----------+----------+

| Фамилия |Дни| Оклад | Зарплата |

+---------------------------+---+----------+----------+

|Николаев | 15| 4800.00| 3000.00|

|Сидоров | 19| 4350.00| 3443.75|

|Малышев | 21| 4350.00| 3806.25|

|Соколов | 12| 7800.00| 3900.00|

|Петров | 15| 6300.00| 3937.50|

|Иванов | 24| 5600.00| 5600.00|

+---------------------------+---+----------+----------+

|Итого | 23687.50|

+------------------------------------------+----------+

Сортировка выполнена корректно.

Проверка алгоритма сортировки для списков с различным количеством элементов:

Количество элементов в списке

Количество сравнений при сортировке по имени

Количество сравнений при сортировке по зарплате

Максимальное количество сравнений

5

10

10

10

10

39

42

42

15

102

95

102

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]