Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка файла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Совсем новичок
Доброго времени суток.
Вот задача упорядочения данных файла.(файл неструктурированный!) (не могу решить вообще :-), выручайте!)

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


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


Заранее благюдарю за помощь! good.gif
volvo
Уточнение: файл у тебя неструктурированный, хорошо... Он что, текстовый? (иначе, как именно ты хранишь названия объектов и их размерности?)

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

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

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

Добавлено через 46 сек.
Как это сделать? Не представляю.
volvo
Цитата
А может прочитать данные файла в структуру
А тебя что, просто так спрашивал, какое ограничение существует на размер файла? Попробуй, прочти, при размере файла больше, скажем, 60Кбайт... Ну, или чуть больше - если использовать динамические структуры данных...
Совсем новичок
Но сортировка слиянием меня не устраивает. Ладна, структура тоже не годится.
volvo
Цитата
Но сортировка слиянием меня не устраивает.
Чем, можно поинтересоваться?
Совсем новичок
Слишком сложно. Будем считать, что я не знаю об этом способе ничего и нужно решить задачу более простым способом.
volvo
Значит задавай ограничения на размер файла, читай его содержимое в массив (или любую другую структуру данных), сортируй эту структуру, и перезаписывай в файл... Бесплатных пирожных не бывает. Не знаешь - учись, не хочешь - ограничивай исходные данные.
not_programmer
Решил эту задачу.
Одно замечание: в исходном файле с данными, данные хранятся в виде:
<название объекта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.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.