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

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

Форум «Всё о Паскале» _ Задачи _ Сортировка файла

Автор: Совсем новичок 2.11.2007 2:03

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

В файле содержится инфа в таком виде:
<название_объекта_1>, <размерность_обЪекта_1>
<название_объекта_2>, <размерность_обЪекта_2>
<название_объекта_3>, <размерность_обЪекта_3>
...
...
и т.д.
(сколько угодно обЪектов)


В НОВЫЙ файл переписать упорадоченную, например, по убыванию "размерности_объекта" инфу, т.е., например:
если "<размерность_обЪекта_2>" больше "<размерность_обЪекта_1>" и всех остальных, а "<размерность_обЪекта_1>" больше "всех остальных", то в новый файл переписывается:
<название_объекта_2>, <размерность_обЪекта_2>
<название_объекта_1>, <размерность_обЪекта_1>
<название_объекта_3>, <размерность_обЪекта_3>
...
...
и т.д.


Заранее благюдарю за помощь! good.gif

Автор: volvo 2.11.2007 2:10

Уточнение: файл у тебя неструктурированный, хорошо... Он что, текстовый? (иначе, как именно ты хранишь названия объектов и их размерности?)

Задача сводится к сортировке строк в текстовом файле... Тогда еще дополнительный вопрос: размер файла (в смысле, количество строк) хоть как-то ограничен?

Автор: Совсем новичок 2.11.2007 2:14

Да, файл текстовый.
Количество строк неограничено.

Автор: volvo 2.11.2007 2:46

Значит, тебе сюда: http://forum.pascal.net.ru/index.php?s=&showtopic=10838&view=findpost&p=68835

(поменяй типизированные файлы на текстовые, но алгоритм-то останется тем же...)

Автор: Совсем новичок 2.11.2007 2:59

А есть более простой способ сортировки файла?

Добавлено через 5 мин.
А может прочитать данные файла в структуру, затем упорядочить и записать в новый файл?

Добавлено через 46 сек.
Как это сделать? Не представляю.

Автор: volvo 2.11.2007 3:28

Цитата
А может прочитать данные файла в структуру
А тебя что, просто так спрашивал, какое ограничение существует на размер файла? Попробуй, прочти, при размере файла больше, скажем, 60Кбайт... Ну, или чуть больше - если использовать динамические структуры данных...

Автор: Совсем новичок 2.11.2007 3:31

Но сортировка слиянием меня не устраивает. Ладна, структура тоже не годится.

Автор: volvo 2.11.2007 5:12

Цитата
Но сортировка слиянием меня не устраивает.
Чем, можно поинтересоваться?

Автор: Совсем новичок 2.11.2007 16:03

Слишком сложно. Будем считать, что я не знаю об этом способе ничего и нужно решить задачу более простым способом.

Автор: volvo 2.11.2007 16:07

Значит задавай ограничения на размер файла, читай его содержимое в массив (или любую другую структуру данных), сортируй эту структуру, и перезаписывай в файл... Бесплатных пирожных не бывает. Не знаешь - учись, не хочешь - ограничивай исходные данные.

Автор: not_programmer 17.12.2007 0:01

Решил эту задачу.
Одно замечание: в исходном файле с данными, данные хранятся в виде:
<название объекта1>
<размерность1>
<пустая строка>
<название объекта2>
<размерность2>
<пустая строка>
<название объекта3>
<размерность3>
...
(мне так легче считывать в структуру)
(у меня задание было про реки и их протяженность)


Program Rivers;
Uses
Crt;
Type
River = Record
Name : String;
Length : Integer;
END;

Var
Mas : Array[1..100] Of River;
Input, Output : Text;
I, J, N : Integer;
BufName : String;
BufLength : Integer;
NameOfFile : String;

BEGIN
ClrScr;
Write('Enter name of file : ');
Readln(NameOfFile);
Assign(Input,'Input.txt');
Reset(Input);
assign(Output,'Output.txt');
Rewrite(Output);
While (NOT EOF(Input)) Do
BEGIN
Inc(I);
ReadLn(Input,Mas[I].Name);
ReadLn(Input,Mas[I].Length);
ReadLn(Input);
end;
For N := 1 To I - 1 Do
For J := 1 To (I - N) Do
If Mas[J].Length < Mas[J + 1].Length Then
BEGIN
BufName := Mas[J].Name;
Mas[J].Name := Mas[J + 1].Name;
Mas[J + 1].Name := BufName;
BufLength := Mas[J].Length;
Mas[J].Length := Mas[J + 1].Length;
Mas[J + 1].Length := BufLength;
END;
For J := 1 To (I - 1) Do
BEGIN
WriteLn(Output, Mas[J].Name);
WriteLn(Output, Mas[J].Length);
WriteLn(Output);
END;
Close(Input);
Close(Output);
END.