IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Опять с динамической памятью
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

Репутация: -  0  +


Когда то я к вам уже обращался, но вы мне так и не дали 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.

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

Сообщение отредактировано: Child of Bodom -


Прикрепленные файлы
Прикрепленный файл  RGR_ZAD_.PAS ( 1.12 килобайт ) Кол-во скачиваний: 174
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

Репутация: -  0  +


Ну не знаю по идее пузырьковой, тока там перестановок нет а ищется просто максимальный элемент. А что так не будет работать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

  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...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

Репутация: -  0  +


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


Гость






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

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


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

Репутация: -  0  +


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


Гость






Ты не хочешь читать, что тебе пишут... Как знаешь. Вот что я имел в виду:
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.

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

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


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

Репутация: -  0  +


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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.07.2021 23:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name