Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Опять с динамической памятью

Автор: Child of Bodom 7.04.2007 13:35

Когда то я к вам уже обращался, но вы мне так и не дали jndtnf(FAQи я уже все перечитал и не понимаю все равно как мне сделать). А вот и само задание : Реализовать на базе массива динамическую структуру, указанную в варианте: Дан массив записей, содержащий данные: ФИО, стаж работы, ставка. Создать упорядоченный по ФИО список, не перемещая записи.
Меня надо немного подправить в самой процедуре сортировке(надеюсь остальное то правильно будет). Вот что я наработал:

Program Spisok;
uses crt;
const n=5;
type uk=^zapis;
zapis=record
Fio:string[20];
Stavka,Stazh:integer;
next:uk;
end;
Mas=array [1..n] of zapis;

var a:mas;
s:zapis;
i:integer;
z,beg:uk;
Procedure vvod (var s:zapis;var a:mas);
begin
for i:=1 to n do begin
Writeln ('Введите фамилию');
readln (s.Fio);
writeln ('Введите стаж работы');
readln (s.Stazh);
writeln ('Введите ставку');
readln (s.Stavka);
a[i]:=s;
end;
end;
Procedure sort (var a:mas;var s:zapis;var beg:uk);
var i,j:integer;
p,max,p1:uk;
begin
for i:=1 to n do begin
p^:=a[1];
if a[i].FIO>p^.FIO then
p^:=a[i];
end;
for j:=n downto 2 do begin
for i:=1 to n do begin
max^:=a[1];
if a[i].Fio>max^.FIO then
max^:=a[i];
end;
beg:=max; - вот с этими указателями не могу понять как их сделать чтоб работало
p1:=max;
beg^.next:=p;
end;
end;
Procedure vivod (var beg:uk);
var p:uk;
begin
writeln ('Фамилия Стаж работы Ставка ');
p:=beg;
while p<>nil do begin
write (p^.FIO:10);
write (p^.Stazh:20);
write (p^.stavka:25);
p:=p^.next;
end;
end;
BEGIN
clrscr;
VVod (s,a);
clrscr;
sort(a,s,beg);
vivod(beg);
readln;
end.

Помогите плиз, ну никак не пойму


Прикрепленные файлы
Прикрепленный файл  RGR_ZAD_.PAS ( 1.12 килобайт ) Кол-во скачиваний: 238

Автор: мисс_граффити 7.04.2007 13:46

Извини, а ты какой метод сортировки используешь?

Автор: Child of Bodom 7.04.2007 13:51

Ну не знаю по идее пузырьковой, тока там перестановок нет а ищется просто максимальный элемент. А что так не будет работать?

Автор: volvo 7.04.2007 14:05

Цитата
Создать упорядоченный по ФИО список, не перемещая записи.
При твоем условии лучше всего сортировать по индексам, т.е. перемещать не значения записей, а только их индексы:
если обычная сортировка выглядит так:

  For i := 1 To n Do
For j := n DownTo i+1 Do
If ar[j - 1] > ar[j] Then Begin
T := ar[j - 1]; ar[j - 1] := ar[j]; ar[j] := T
End

, то тебе надо переделать ее:
  For i := 1 To n Do
For j := n DownTo i+1 Do
If ar[index[j - 1]] > ar[index[j]] Then Begin
T := index[j - 1]; index[j - 1] := index[j]; index[j] := T
End

а потом пройти по всему массивуи изменить соответствующим образом значение поля next...

Автор: Child of Bodom 7.04.2007 14:40

Если вот так менять индексы то получится, что как бы меняем индексы чисел, и потом по порядку выводим массив, а поле next тогда вообще не нужно иил я чего то не догоняю. Я вот как хотел, находим максимальную фамилию(последнюю по алфавиту), даем ей значение p (указатель )ну вот эту p указывает beg и вот так налево идти, те beg будет изменятся по мере нахождения нового максимума. Не знаю поймете?

Автор: volvo 7.04.2007 14:46

А тебе поле next и так вообще не нужно... Ты бы решил, ЧТО тебе нужно, список или массив? Если список, то он создается по другому, если массив - то зачем указатель на следующий элемент?

А можно сделать очередное извращение, и заполнить массив, отсортировать его так, как я показал, потом заполнить поля next согласно индексному массиву, и работать с этим массивом как со списком, т.е. с использованием указателя на голову, и поля next... Если нужно пример - скажи, я сделаю (просто так "в пустоту" делать не буду...)

Автор: Child of Bodom 7.04.2007 15:00

Просто я делаю расчетку оп теме которую мы ща проходим "Динамическая память". И мне вот такое задание впихнули. И как бы вот нада сделать точно заполнить массив, и отстортировать не меняя самих записей, может и по индексам отсортировать. Я уж теперь не знаю!!! А вот как лучше просто индексы поменять их и потом вывести как бы получившийся отсортированный массив или вот мой метод ищем в массиве фамилию максимальную и т д

Автор: volvo 7.04.2007 15:06

Ты не хочешь читать, что тебе пишут... Как знаешь. Вот что я имел в виду:

uses crt;
const
n = 5;

type
uk = ^zapis;
zapis = record
Fio: string[20];
Stavka, Stazh: integer;
next: uk;
end;

Mas = array[1 .. n] of zapis;
TIndex = array[1 .. n] of integer;

function sort_as_list(var arr: mas): uk;
var
ix: TIndex;
i, j: integer;
T: integer;
begin

for i := 1 to n do
ix[i] := i;

for i := 1 to n do
for j := n downto i + 1 do
If arr[ix[j - 1]].fio > arr[ix[j]].fio then begin
T := ix[j - 1]; ix[j - 1] := ix[j]; ix[j] := T
end;

sort_as_list := @arr[ix[1]];
for i := 1 to n - 1 do
arr[ix[i]].next := @arr[ix[i + 1]];
end;


const
arr: mas = (
(fio:'petrov'; stavka:2000; stazh:4; next:nil),
(fio:'sidorov'; stavka:2000; stazh:4; next:nil),
(fio:'alexeev'; stavka:2000; stazh:4; next:nil),
(fio:'ivanov'; stavka:2000; stazh:4; next:nil),
(fio:'kruglov'; stavka:2000; stazh:4; next:nil)
);
var
p, root: uk;


begin
root := sort_as_list(arr);
p := root;
while p <> nil do begin
with p^ do
writeln(fio:20, stavka:6, stazh:6);
p := p^.next;
end;

end.

(заполнение массива вручную заменено на константу, для тестирования... Создается массив, записи НЕ перемещаются, распечатываются данные уже отсортированными, все пункты задания выполнены.)

Цитата
А вот как лучше просто индексы поменять их и потом вывести как бы получившийся отсортированный массив или вот мой метод ищем в массиве фамилию максимальную и т д
Реализуй свой метод, и сравни объем кода и скорость выполнения... Тогда и узнаешь, что лучше, а что хуже.

Автор: Child of Bodom 7.04.2007 15:23

Ух ты круто!!! работает, только можете объяснить вот этот массив зачем TIndex = array[1 .. n] of integer; и еще как заменить вот те константы на ввод с клавиатуры, а то мы такую штуку не проходили. Просто баюсь меня спалят с таким умным кодом. И надо писать там еще про поле next?