Консультация № 178155
01.05.2010, 14:16
0.00 руб.
0 10 1
Доброго времени суток дорогие эксперты!

Выношу условие задачи которую надо написать на Паскаль(упомянутую в Си мной)

Код:
Напистаь подпрограмму для универсальной сортировки произвольного массива с произвольным базовым типом. Подпрограмме передается массив как нетипизованный параметр, его длина, размер элемента и логическая функция сравнения двух элементов массива.

С использованием этой подпрограммы решить следующую задачу.

Имеется информация о студентах группы: Ф.И.О., результаты последней экзаменационной сессии. Требуется получить список студентов с указанием среднего балла по итогам сессии, упорядоченный по указанию пользователя либо лексикографически, либо по невозрастанию среднего балла.



Подобрать набор тестовых данных!

Спасибо за внимание!

Обсуждение

Неизвестный
02.05.2010, 19:48
общий
Не понял, что это значит:
Подобрать набор тестовых данных!

И второе: зачем длина массива передается. В Си классическом это может и нужно, а в Паскале можно использовать открытые массивы. Может их применить? Или обязательно использовать нетипизированный параметр?
Неизвестный
02.05.2010, 20:18
общий
Имеется информация о студентах группы
- Как она имеется? Как вводить?
Неизвестный
03.05.2010, 10:21
общий
Цитата: 422
И второе: зачем длина массива передается. В Си классическом это может и нужно, а в Паскале можно использовать открытые массивы. Может их применить? Или обязательно использовать нетипизированный параметр?


Можно конечно.

Цитата: 422
Не понял, что это значит:


Это значит что написать пример того, какие данные вы использовали чтобы протестировать программу.

Цитата: 422
Имеется информация о студентах группы
- Как она имеется? Как вводить?


Дана в фаиле текстовом.
Неизвестный
03.05.2010, 15:41
общий
Да, совсем забыл, в каком Паскале? Ой, подозреваю, что АВС
Неизвестный
03.05.2010, 16:40
общий
Если делать так:
Код:
TYPE
func_compare = function (var v1, v2): Integer;

TOneStud = record
name: String[name_len];
scores: array[1..score_ar_len] of byte;
mid : Real;
end;

function UpRuss(src: String): String;
{все буквы, в том числе и русские - в заглавные.
Нужна для корректного сравнения}
var i, len: Integer;
begin
len := length(src);
for i := 1 to len do
case src[i] of
'a'..'z': src[i] := UpCase(src[i]);
'а'..'п': src[i] := chr(ord(src[i]) - 32);
'р'..'я': src[i] := chr(ord(src[i]) - 80);
end;
UpRuss := src
end;

function CompareLexigraf(var value1, value2): Integer; far;
{0 - если равны, -1 - если value1 < value2, +1 - если value1 > value2
по фамилиям без учета регистра}
var r1: TOneStud absolute value1;
r2: TOneStud absolute value2;
begin
if UpRuss(r1.name) > UpRuss(r2.name) then CompareLexigraf := 1
else
if UpRuss(r1.name) < UpRuss(r2.name) then CompareLexigraf := -1
else CompareLexigraf := 0
end;
то передавать длину одной записи и не надо. Пойдет ли?
Неизвестный
04.05.2010, 19:35
общий
Ау! Какой Паскаль надо использовать?
Неизвестный
05.05.2010, 20:32
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.
Выкладываю заготовку. Если уточните, что нужно (если еще следите за этим вопросом - в чем уже сомневаюсь) - допишу, как нужно

Приложение:
uses CRT;
CONST
base_FileName = '178155.dat';
name_len = 25;
score_ar_len = 4;
stud_ar_len = 10;

TYPE
func_compare = function (var v1, v2): Integer;

TOneStud = record
name: String[name_len];
scores: array[1..score_ar_len] of byte;
mid : Real;
end;

function UpRuss(src: String): String;
{все буквы, в том числе и русские - в заглавные.
Нужна для корректного сравнения}
var i, len: Integer;
begin
len := length(src);
for i := 1 to len do
case src[i] of
'a'..'z': src[i] := UpCase(src[i]);
'а'..'п': src[i] := chr(ord(src[i]) - 32);
'р'..'я': src[i] := chr(ord(src[i]) - 80);
end;
UpRuss := src
end;

function CompareLexigraf(var value1, value2): Integer; far;
{0 - если равны, -1 - если value1 < value2, +1 - если value1 > value2
по фамилиям без учета регистра}
var r1: TOneStud absolute value1;
r2: TOneStud absolute value2;
begin
if UpRuss(r1.name) > UpRuss(r2.name) then CompareLexigraf := 1
else
if UpRuss(r1.name) < UpRuss(r2.name) then CompareLexigraf := -1
else CompareLexigraf := 0
end;

function CompareByMid(var value1, value2): Integer; far;
{0 - если равны, -1 - если value1 < value2, +1 - если value1 > value2
по средней оценке}
var r1: TOneStud absolute value1;
r2: TOneStud absolute value2;
begin
if r1.mid > r2.mid then CompareByMid := 1
else
if r1.mid < r2.mid then CompareByMid := -1
else CompareByMid := 0
end;

procedure Sort(var ar; len, size_of_one: Integer;
compare_func: func_compare);
begin
end;

procedure PrintOne(var el; position, size_of_one: Integer);
{Предполагаем, что за диапазон не выходит
position - положение элемента, счет с 1}
var t: array[1..2] of TOneStud absolute el;
i: Integer;
begin
{$R-}
Write(t[position].name,' ');
for i:=1 to score_ar_len do Write(t[position].scores[i]:4);
WriteLn(' ',t[position].mid:6:2);
{$R+}
end;

procedure PrintAll(var ar; len, size_of_one: Integer);
var r: array[1..1] of TOneStud absolute ar;
i: Integer;
begin
for i:=1 to len do begin
Write(i:2,') ');
PrintOne(ar, i, sizeof(TOneStud));
end
end;

procedure SaveToFile(aFileName: String; var ar; len: Integer);
var f: File of TOneStud;
r: array[1..1] of TOneStud absolute ar;
i: Integer;
begin
Assign(f, aFileName);
{$I-} Reset(f); {$I+}
if IOResult = 0 then begin
WriteLn('Файл ',UpRuss(aFileName),' существует. Заменить? (Y/N)');
case ReadKey of
'y','Y','н','Н': Close(f);
else begin
Close(f); Exit; {немедленный вход из подпрограммы}
end
end
end;
Rewrite(f);
{$R-} {Отключаем проверку выхода за диапазон}
for i :=1 to len do
Write(f, r[i]);
{$R+}
Close(f)
end;

function LoadFromFile(aFileName: String; var ar; maxlen: Integer): Integer;
{Возвращает число считанных элементов, но не больше maxlen}
var
f: File of TOneStud;
r: Array[1..1] of TOneStud absolute ar;
i: Integer;
begin
Assign(f, aFileName);
{$I-} Reset(f); {$I+}
if IOResult <> 0 then begin
WriteLn('Не могу открыть файл ',UpRuss(aFileName));
Exit;
end;
i := 0;
while NOT EOF(f) do
begin
inc(i);
Read(f, r[i]);
end;
LoadFromFile := i;
end;

function Input_OneStud(var ar;
max_len, size_of_one, cur_pos: Integer): Boolean;
{Если отказались от ввода, то ЛОЖЬ, если введено, то истина
cur_pos - каким элементом записать. Если больше max_len, то не вводит}
var
r: array[1..2] of TOneStud;

begin
end;

VAR
studs: array[1..stud_ar_len] of TOneStud;
i: Integer;
count: Integer;
BEGIN
randomize;
with studs[5] do
begin
name := 'abc';
for i:=1 to score_ar_len do
scores[i] := 2 + random(4);
mid := 0;
for i :=1 to score_ar_len do mid := mid + scores[i];
mid := mid / score_ar_len
end;
PrintAll(studs, 10, sizeof(TOneStud));
END.
Неизвестный
06.05.2010, 14:22
общий
тп7 или Borland пойдет
Неизвестный
06.05.2010, 14:33
общий
А вариант работы, показанный в "ответе" пойдет? Повторяю, особенность в том, что передавать длину одной записи не нужно при такой работе.
Еще, раз отозвались, допишу процедуры чтения и сохранения. Вот там можно обойтись без знания структуры записи - только ее размер.
То есть, знать представление (структуру записи) нужно только в процедурах вывода и сравнения (коррекктного сравнения - подеркну. В примерах найдете вариант, где побайтно сравниваются "равны-не равны", но у Паскаля в начале каждой строки стоит байт длины. Так что более короткая строка будет всегда меньше более длинной: "Сидоров" будет идти ПЕРЕД "Аавраамовым". Именно это и имею в виду под термином "корректное сравнение")
Неизвестный
12.05.2010, 16:21
общий
Ответ пойдет. Как раз нужно без знания структуры записи. Знать только размер сортировке нужно. Если будут вот просы еще я задам сюда же по этой работе
Форма ответа