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

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

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

 
 Ответить  Открыть новую тему 
> Опять с динамической памятью
Child of Bodom
сообщение 7.04.2007 9:35
Сообщение #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 - 7.04.2007 9:36


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


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

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

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


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


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


Новичок
*

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

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


Ну не знаю по идее пузырьковой, тока там перестановок нет а ищется просто максимальный элемент. А что так не будет работать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.04.2007 10:05
Сообщение #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...
 К началу страницы 
+ Ответить 
Child of Bodom
сообщение 7.04.2007 10:40
Сообщение #5


Новичок
*

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

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


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


Гость






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

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


Новичок
*

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

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


Просто я делаю расчетку оп теме которую мы ща проходим "Динамическая память". И мне вот такое задание впихнули. И как бы вот нада сделать точно заполнить массив, и отстортировать не меняя самих записей, может и по индексам отсортировать. Я уж теперь не знаю!!! А вот как лучше просто индексы поменять их и потом вывести как бы получившийся отсортированный массив или вот мой метод ищем в массиве фамилию максимальную и т д
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.04.2007 11:06
Сообщение #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.

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

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


Новичок
*

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

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


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

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

 



- Текстовая версия 23.06.2025 15:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"