- •Программирование на языке Паскаль
- •Содержание
- •Оформление лабораторных работ
- •Текст программы
- •Экранные меню и циклы Постановка задачи
- •Математическая модель
- •Описание алгоритма
- •Текст программы
- •Процедуры и функции Постановка задачи
- •Математическая модель
- •Описание алгоритма
- •Текст программы
- •Работа с файлами и алгоритмы сортировки Постановка задачи
- •Математическая модель
- •Описание алгоритма
- •Текст программы
- •Inc(Cmp); {Подсчет количества сравнений}
- •Inc(Cmp); {Подсчет количества сравнений}
- •Визуальное программирование Постановка задачи
- •Математическая модель
- •Основная форма программы
- •Основные свойства формы
- •Элементы формы
- •Текст программы
- •Библиографический список
Текст программы
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).