Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2009, 14:28   #1
sixxn
 
Регистрация: 10.05.2009
Сообщений: 5
По умолчанию Сортировка записей в тип. файле

Здарствуйте! Подскажите, как произвоить сортировку записей в типизированном файле? В работе (база данных аэропорта), которую мне нужно выполнить есть следующее задание, вызывающее трудности. К сожалению никто подсказать мне толком не смог, так что вся надежда на вас. Вот как звучит задание:
- вывести на экран сведения о самолетах, прибывших последоваельно с заданного времени.

Тоесть, проще говоря: вводим заданное время, а на экран выводится информация о рейсах (например время прибытия и страна), которое больше этого времени. При это между собой эти записи должны быть отсортированы, по времени прибытия.

Вот моя вариант с пояснениями что в фигурных скобках. (Сортировка в нем не происходит, а делается только вывод на экран, в том порядке в котором я вбивал):

Код:
procedure timetarget;
var i,j,n:integer; ans:byte; d,c:real;
begin
repeat
clrscr;
reset(f);
assign(ros,'ros.dat');
rewrite(ros);
writeln('Input the time target');
read(d);
n:=0;
while not eof(f) do
begin
read (f,z);
if z.arrival>=d then begin write (ros,z); n:=n+1 end;
end;
{те записи у которых время больше или равно введенному времени записываем в другой тип. файл чтобы сортировать только те записи которые удовлетворяют условию, а не все которые мы ввели}
close(f);
{а теперь сортировка}
reset(ros)
while not eof(ros) do begin
for i:=1 to (n-1) do
for j:=i+1 to n do;
read(ros,z);
if t[i].arrival> t[j].arrival then
begin c:=t[i].arrival;
     t[i].arrival:=t[j].arrival;
     t[j].arrival:=c;
end;
write(z.arrival:5:2,' '); writeln(z.country);  end;
writeln; textcolor(blue); write('  0 - exit, 1 - continue ');
readln (ans) until ans=0;
close(ros) end;
Вообщем заранее спасибо. С нетерпением жду ваших советов! =)
sixxn вне форума Ответить с цитированием
Старый 10.05.2009, 15:08   #2
sixxn
 
Регистрация: 10.05.2009
Сообщений: 5
По умолчанию

Если у вас нет желания разбираться в том что я написал, подскажите общие варианты сортировок в тип. файле. Мне надо хотя бы идею увидеть, дальше я сам постараюсь врубиться как написать))
sixxn вне форума Ответить с цитированием
Старый 10.05.2009, 15:57   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

sixxn
То есть вы считываете данные в массив?
Я бы так сделал: идем по файлу. Считываем очередной элемент в tmp. Если время прибытия >= того, что нужно, то добавляем этот рейс в массив.
После этого просто сортируем этот массив по времени прибытия и выводим.
Почему бы так не сделать?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 10.05.2009, 16:27   #4
sixxn
 
Регистрация: 10.05.2009
Сообщений: 5
По умолчанию

tmp - Это tip? Или это что то другое?
Цитата:
Если время прибытия >= того, что нужно, то добавляем этот рейс в массив.
Не очень понимаю как это выглядит. Напишите если не трудно
я понимаю что if z.arrival>=d then begin (а вот здесь непонятно: как сам рейс в массив считать? t[i]:=z что ли?)

Последний раз редактировалось sixxn; 10.05.2009 в 16:42.
sixxn вне форума Ответить с цитированием
Старый 10.05.2009, 16:47   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
tmp - Это tip? Или это что то другое?
Просто я у вас не вижу объявления структуры.
Сделайте запись "рейс". В ней поля "название" (самолета или еще чего-нибудь) и время прибытия.
Код:
type reis = record
name : string;
arrival : integer;
end;
Здесь тип для arrival (время) сами выберите, какой вам надо.
Вот считываете поэлементно в tmp (типа reis).
Еще будет массив из reis-ов. И переменная, указывающая его размер.
И вот когда прочитали элемент:
Код:
if tmp.arrival>=d then
 begin
 inc(n);
 mas[n] := tmp;
 end;
Как-то так. Ну а потом уже этот массив сортируете и выводите.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 10.05.2009, 17:08   #6
sixxn
 
Регистрация: 10.05.2009
Сообщений: 5
По умолчанию

у меня и так запись есть просто она объявлена в начале программы, а не в процедуре и массив тоже там объявлен.
Код:
type zap = record airport, country:string [13];
city:string [13];
trip: integer;
plane: string [13];
code: real;
depature: real;
arrival: real;
seats: integer;
freeseats: integer;
reservedseats: integer;
price: real;
distance: real;

end;
var f, ros: file of zap;
z:zap; num,i,j:integer;
t: array[1.. 100] of zap;
Или вы имеете ввиду что нужно создать еще одну запись? Мне кажется ведь можно работать прямо с этой просто потом вывести на экран что нам нужно. Или я что то недопонимаю?


Вообщем вот что сделал но на экран выдается теперь несколькр раз последний введенный файл. Толи в сортировек ошибка толи в выводе. Вообщем вот:
Код:
clrscr;
reset(f);
assign(ros,'ros.dat');
writeln('Input the time target');
read(d);
n:=0;
while not eof(f) do
begin
read (f,z);
if z.arrival>=d then begin t[i]:=z; n:=n+1 end;end;
for i:=1 to (n-1) do
for j:=i+1 to n do
if t[i].arrival> t[j].arrival then
begin c:=t[i].arrival;
     t[i].arrival:=t[j].arrival;
     t[j].arrival:=c;
end;
for i:=1 to n do begin
write(z.arrival:5:2,' '); writeln(z.country); end;

Последний раз редактировалось sixxn; 10.05.2009 в 17:11.
sixxn вне форума Ответить с цитированием
Старый 10.05.2009, 17:21   #7
sixxn
 
Регистрация: 10.05.2009
Сообщений: 5
По умолчанию

Все получилась. Не заметил ошибку. На i надо было тоже счетчик ставить! Иначе запись все время присваивалась 1-ому элементу. Вот как правильно:
Код:
clrscr;
reset(f);
assign(ros,'ros.dat');
writeln('Input the time target');
read(d);
n:=0;
i:=1;
while not eof(f) do
begin
read (f,z);
if z.arrival>=d then begin n:=n+1; t[i]:=z; i:=i+1 end;end;
for i:=1 to (n-1) do
for j:=i+1 to n do
if t[i].arrival> t[j].arrival then
begin c:=t[i].arrival;
     t[i].arrival:=t[j].arrival;
     t[j].arrival:=c;
end;
for i:=1 to n do begin
write(t[i].arrival:5:2,' '); writeln(t[i].country); end;

Sazary, благодарю за помощь! =))
sixxn вне форума Ответить с цитированием
Старый 10.05.2009, 17:24   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Или вы имеете ввиду что нужно создать еще одну запись? Мне кажется ведь можно работать прямо с этой просто потом вывести на экран что нам нужно. Или я что то недопонимаю?
Нет. Просто я думал, что у вас не объявлен тип.
Цитата:
Все получилась.
Отлично )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка записей, Pascal leench Помощь студентам 5 16.04.2009 22:10
Сортировка записей в файле. Turbo Pascal. Dexterello Помощь студентам 1 28.02.2009 18:14
Сортировка записей. Whiplash Паскаль, Turbo Pascal, PascalABC.NET 3 17.12.2008 21:39