Другие языки программирования и технологии

Как сделать сортировку значений заработных плат

program z_1;

type

vedom = record

fio: string;

zar1: integer;

zar2: integer;

zar3: integer;

zar4: integer;

zar5: integer;

zar6: integer;

zar7: integer;

zar8: integer;

zar9: integer;

zar10: integer;

zar11: integer;

zar12: integer;

end;

var

mas: array [1..10] of vedom;

n,i: integer;

procedure input;

begin

writeln('Работник №',i);

write('Введите ФИО: ');

readln(mas[i].fio);

write('Зароботная плата за январь: ');

readln(mas[i].zar1);

write('Зароботная плата за февраль: ');

readln(mas[i].zar2);

write('Зароботная плата за март: ');

readln(mas[i].zar3);

write('Зароботная плата за апрель: ');

readln(mas[i].zar4);

write('Зароботная плата за май: ');

readln(mas[i].zar5);

write('Зароботная плата за июнь: ');

readln(mas[i].zar6);

write('Зароботная плата за июль: ');

readln(mas[i].zar7);

write('Зароботная плата за август: ');

readln(mas[i].zar8);

write('Зароботная плата за сентябрь: ');

readln(mas[i].zar9);

write('Зароботная плата за октябрь: ');

readln(mas[i].zar10);

write('Зароботная плата за ноябрь: ');

readln(mas[i].zar11);

write('Зароботная плата за декабрь: ');

readln(mas[i].zar12);

writeln;

end;

procedure output;

begin

writeln(mas[i].fio:30, ' | ', mas[i].zar1, ' | ', mas[i].zar2, ' | ', mas[i].zar3, ' | ', mas[i].zar4, ' | ', mas[i].zar5, ' | ', mas[i].zar6, ' | ', mas[i].zar7, ' | ', mas[i].zar8, ' | ', mas[i].zar9, ' | ', mas[i].zar10, ' | ', mas[i].zar11, ' | ', mas[i].zar12);

end;

begin

writeln('Количество работников: ');

readln(n);

writeln;

writeln('Введите фамилию работников ');

for i:=1 to n do

input;

writeln;

writeln('Ведомость');

writeln('ФИО':30, ' | ', 'Зар. плата');

for i:=1 to n do

output;

end.

Как сделать сортировку значений заработных плат которые совпадают с соседями по ведомости в одном месяце. Как и что куда подставить?
Таком виде программы тебе прийдётся делать 12 процедур сортировки для каждого месяца по отдельности!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Во-первых: Если тебе нужно получить зарплату, скажем, за 10 месяц (который будет задан параметром) , то твои действия?
— Обрабатывать массив mas по параметру mas[i].zar10
… А для 3 месяца?
Значит zar1, zar2, …, zar12 нужно превратить в массив:

type vedom = recordfio : string;zar : array [1..12] of integer;end;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Во-вторых: Как следствие вышесказанного, можно названия месяцев перенести в константы:

const MonthName : array [1..12] of String[8] = ('январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь');

И переделать ввод зарплаты на цикл:

var Month : Byte;

for Month := 1 to 12 do begin Write('Зароботная плата за ', MonthName[Month], ': '); ReadLn(mas[i].zar[Month]); end;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Во-третьих: Использование глобальных переменных в подпрограммах — плохой тон. (Если где-то в программе возникнет необходимость переименовать переменную, то прийдётся весь код перелопачивать ;–) И вообще, проще передать процедуре ввода значение массива как переменную:

procedure Input(NumWorker : Byte; var Worker : Vedom);
var Month : Byte;
begin
WriteLn('Введите сведения о заработной плате работника № ', NumWorker);Write('Введите ФИО: '); ReadLn(Worker.fio);
for Month := 1 to 12 do begin Write('Зароботная плата за ', MonthName[Month], ': '); ReadLn(Worker.zar[Month]); end;
end;

for i:=1 to n do Input(i, mas[i]); { Это вместо for i:=1 to n do input; }

Вот такая маленькая процедурка вместо исходной!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
В-четвёртых: Названия переменных нужно давать понятные! Чтобы в дальнейшем было самому понятно что и зачем в программе… И не забывать делать комментарии, которые в дальнейшем не будут заставлять тебя вспоминать что к чему.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Теперь вся твоя «новая» программа:

const MonthName : array [1..12] of String[8] = ('январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь');

type tVedom = record
FIO : String;Salary : array [1..12] of Integer;
end;

type tArrVedom : array [1..30] tVedom;

{ Ввод сведений о заработной плате работника }
procedure Input(NumWorker : Byte; var Worker : tVedom);
var Month : Byte;
begin
WriteLn('Введите сведения о заработной плате работника № ', NumWorker);Write('Введите ФИО: '); ReadLn(Worker.fio);
or Month := 1 to 12 do begin Write('Зароботная плата за ', MonthName[Month], ': '); ReadLn(Worker.zar[Month]); end;
end;

{ Процедура вывода ведомости о зарплате }
procedure Output(Num : Byte; Arr : tArrVedom);
var N, Month : Byte;
begin
WriteLn('Ведомость по зарплате работников: ');
Write('__________ФИО_________________ '); for Month := 1 to 12 do Write('|', MonthName[Month]:10); WriteLn;
for N := 1 to Nom do begin
Write(Arr[N].FIO:30); for Month := 1 to 12 do Write('|', Arr[N].Salary[Month]:10); WriteLn;
end;
end;

var NumEmpl : Byte; { Количество работников }
ArrVedom : tArrVedom;
i : Byte;
begin
Write('Количество работников: '); ReadLn(NumEmpl);
for i := 1 to NumEmpl do Input(i, ArrVedom[i]);
WriteLn;
Output(NumEmpl);
end.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Вот теперь можно попытаться сделать сортировку… Ибо все данные структурированы и организован доступ к всем значениям по месяцам в виде массива.
Александр Кустов
Александр Кустов
90 592
Лучший ответ
ой Да я уже не помню .