По данной информации определить самых уникальных учеников и самых средних - Pascal
Формулировка задачи:
Доброго времени суток)Пожалуйста,помогите написать программу к задаче:
Имеется информация об учениках некоторого класса из n человек: фамилия, имя, возраст в годах, рост в см., успеваемость – округленный средний балл. Ученик называется среднестатистическим по k –му параметру (уникальным по k параметру), если на нем достигается минимум (максимум) модуля разности среднего арифметического чисел из k –го столбца и значения k –го параметра этого ученика. Ученик называется самым уникальным(самым средним), если он уникален (является среднестатистическим) по самому большому количеству параметров, определить учеников:
а) самых уникальных;
б) самых средних;
в) самых средних среди самых уникальных;
г) самых уникальных среди самых средних.
Решение задачи: «По данной информации определить самых уникальных учеников и самых средних»
textual
Листинг программы
type
TSchoolboy = record
surname, name: String[20];
age, height: Byte;
avr: Real;
end;
TSchoolboyArray = Array[1..255] Of TSchoolboy;
procedure SortArray(var ar: TSchoolboyArray; const a, b: Byte);
var
i, j: Byte;
avr: Real;
procedure Swap(var x, y: TSchoolboy);
var
z: TSchoolboy;
begin
z := x;
x := y;
y := z;
end;
begin
avr := 0;
for i := a to b do
avr := avr + ar[i].avr;
avr := avr / (b - a + 1);
for i := a to b - 1 do
for j := a to b - 1 - i do
if (Abs(ar[j].avr - avr) > Abs(ar[j + 1].avr - avr))
then
Swap(ar[j], ar[j + 1]);
end;
var
ar: TSchoolboyArray;
len, i, j: Byte;
begin
repeat
Write('Сколько учеников? (достаточно большое для репрезентативности алгоритма)');
ReadLn(len);
until (len >= 12); //позже массив делится на трети - треть в уникальные, треть в средние, треть отбрасывается
for i := 1 to len do
with ar[i] do
begin
surname := '';
for j := 1 to Random(20) + 1 do
surname := surname + Chr(Random(26) + 97);
name := '';
for j := 1 to Random(25) + 1 do
name := name + Chr(Random(26) + 97);
age := Random(100);
height := Random(120) + 100;
avr := Random * 5;
WriteLn(surname:20, ' ', name:20, ': возраст - ', age, ', рост - ', height, ', средний балл - ', avr:0:2);
//Write('Фамилия: '); ReadLn(surname);
//Write('Имя: '); ReadLn(name);
//Write('Возраст: '); ReadLn(age);
//Write('Рост: '); ReadLn(height);
//Write('Средний балл: '); ReadLn(avr);
end;
{сортируем массив так, чтобы сначала шли самые средние, а в конце - самые уникальные}
SortArray(ar, 1, len);
WriteLn('А. Самые уникальные:');
for i := (len div 3) * 2 + 1 to len do
with ar[i] do
WriteLn(surname:20, ' ', name:20, ' ', avr:0:2);
WriteLn('Б. Самые средние:');
for i := 1 to len div 3 do
with ar[i] do
WriteLn(surname:20, ' ', name:20, ' ', avr:0:2);
WriteLn('В. Самые средние среди самых уникальных:');
SortArray(ar, (len div 3) * 2 + 1, len);
for i := (len div 3) * 2 + 1 to ((len + (len div 3) * 2 + 1) div 2) do
with ar[i] do
WriteLn(surname:20, ' ', name:20, ' ', avr:0:2);
WriteLn('Г. Самые уникальные среди самых средних:');
SortArray(ar, 1, len div 3);
for i := (len div 6) + 1 to len div 3 do
with ar[i] do
WriteLn(surname:20, ' ', name:20, ' ', avr:0:2);
end.
Объяснение кода листинга программы
- Объявление типа данных
- Объявляется тип данных
TSchoolboy, который содержит поляsurname(фамилия),name(имя),age(возраст),height(рост) иavr(средний балл). - Описывается тип данных
TSchoolboyArray, представляющий массив структур типаTSchoolboy.
- Объявляется тип данных
- Процедура сортировки массива
- Объявляется процедура
SortArray, которая принимает на вход массивarи граничные индексыaиb. - Вложенная процедура
Swapменяет местами значения переменных типаTSchoolboy. - В процедуре
SortArrayподсчитывается среднее значениеavrсреди элементов массива в пределах границaиb. - Сортировка массива
arосуществляется по близости среднего значенияavrк общему среднему (avr), используя функциюAbsи процедуруSwap.
- Объявляется процедура
- Основная часть программы
- Объявляются переменные программы
ar,len,iиj. - Запрашивается количество учеников, пока оно не станет не меньше 12.
- Создается массив
arиз учеников с произвольно заполненными значениями фамилии, имени, возраста, роста и среднего балла. - Массив сортируется сначала по
среднему баллу, затем выводятсясамые уникальныеисамые средниеученики, и, наконец, среди них также производится дополнительная сортировка и выводится более узкая группасамых средних среди самых уникальныхисамых уникальных среди самых средних. Этот код создает и сортирует массив учеников и выводит несколько подгруппсамых уникальныхисамых среднихучеников.
- Объявляются переменные программы