Сортировка строк текстового файла
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.138] |
|
|
Сортировка строк текстового файла
|
Сообщ.
#1
,
|
|
|
|
Всем доброго времени суток! На завтра "вручили" задание но самому розобратся к сожаление времени не хватает =( очень надеюсь на помощь...
Написать програму уорядочевающую строки символов текстового файла от наим. до наиб. результат вывести на экран и в другой текстовый файл. |
|
Сообщ.
#2
,
|
|
|
|
Цитата Pr0bl3matic @ уорядочевающую строки символов текстового файла от наим. до наиб. результат вывести на экран и в другой текстовый файл. а вы можете пример на пАльцах привести, а то как то мутно имхо |
|
Сообщ.
#3
,
|
|
|
|
есть у нас некий файл похожего содержания:
блаблабла блаблабла блабла блабла бла блаблабла блабла бла и его строки нужно упорядочить чтобы получилось: блабла бла блаблабла блабла бла блаблабла блаблабла блабла и эту всю беду вывести на экран и в отдельный файлик, вроде так;) |
|
Сообщ.
#4
,
|
|
|
|
т е нужно отсортировать по длине строк?(а из чего он состоит не важно?)
|
|
Сообщ.
#5
,
|
|
|
|
угу, по длине... хз в задании четко не написано знач не важно=)
|
|
Сообщ.
#6
,
|
|
|
|
вот мой вариант, на самом деле столкнулся со сложностью , т к думал что файл типизированный, а оказалось текстовый, поэтому возможно это полный изврат и "подстановка", т е я перевел действие на параллельные массивы, в общем посмотри:
![]() ![]() program test; {$I-} uses crt; type Tvector = array[1..1] of string; Tnumber = array[1..1] of byte; var t : text; i, j : byte; s : string; vector : ^TVector; number : ^Tnumber; size : integer; k : byte; b : byte; bs : string; newT : text; begin clrscr; assign(t, 'c:\as\forum\t.txt'); reset(t); i := 0; while not eof(t) do begin readln(t, s); inc(i); end; size := i * sizeOf(string); getMem(vector, size); size := i * sizeOf(integer); getMem(number, size); close(t); reset(t); i := 1; while not eof(t) do begin readln(t, vector^[i]); number^[i] := length(vector^[i]); inc(i); end; { writeln(i);{i - 1} for k := (i - 1) downto 2 do begin for j := 1 to (k - 1) do begin if(number^[j] > number^[j + 1]) then begin b := number^[j]; number^[j] := number^[j + 1]; number^[j + 1] := b; bs := vector^[j]; vector^[j] := vector^[j + 1]; vector^[j + 1] := bs; end; end; end; assign(newT, 'c:\as\forum\t1.txt'); rewrite(newT); writeln('После сортировки имеем: '); for k := 1 to (i - 1) do begin writeln(vector^[k]); writeln(newT, vector^[k]); end; close(t); close(newT); freeMem(vector, size); {наверное лучше применить разные size для памяти, чтоб потом можно было корректно освободить оба массива} readln; end. можешь создать исходный файл примерно такое структуры: ![]() ![]() dsfdsf dsf sdfsdfsd fsdlf dsfsdfdsf dfjs sdfdsf dsflsdf fsdlfjs dsfdsfj sdlfjsdlfs fklsdfjsdlfsdlf dflsdfjsdfl sdlfkdslf sdlkfsd ldsfjsdlf dslfsdlfsdlkf dsfdsf df dfdsf ds sdf sdf sdf sdf d и в корне диска С, т е прописать в коде просто assign(t, 'c:\t.txt'); |
|
Сообщ.
#7
,
|
|
|
|
Огромное спасибо! Изврат не изврат... работает? работает!(в даной ситуации это главное) еще раз спасибо=)
|
|
Сообщ.
#8
,
|
|
|
|
как бы тебя завтра не "завернули" на сдаче
. Нужно чтобы посмотрел кто нибудь из гуру, например, наш уважаемый модератор. |
|
Сообщ.
#9
,
|
|
|
|
не освобождается память - лучше все-таки сделать освобождение в конце программы. Плюс ограничение на макс. размер файла... ну это некритично, для того уровня, куда понесена задача
А так вроде всё на месте. Медленно, да, но всё же. |
|
Сообщ.
#10
,
|
|
|
|
thank's Vesper, действительно про освобождение памяти подзабыл(частенько кстати забываю, нужно в паскаль прикрурить свой GC - garbage collector
_). А что касается скорости, как можно это улучшить? Подскажите как быть то?P.S. честно говоря думал, что это "изврат", т к перенес логику на параллельные массивы |
|
Сообщ.
#11
,
|
|
|
|
например, вести счетчик сделанных перестановок, и если он остался 0 после прохождения по массиву, выходить из сортировки.
С одной стороны длину можно динамически вычислять, с другой - это будет дольше, придется лопатить в 128 раз больше инфы каждый цикл. Нормальная логика, по-моему. |
|
Сообщ.
#12
,
|
|
|
|
А что, обязательно делать сортировку самому? Встроенные в ОС функции - по боку?
Тогда зачем они вообще?![]() ![]() {$M $4000, 0, 0} uses dos; procedure action(in_name, out_name: string; is_adding: boolean); var s: string; f_in, f_out: text; begin assign(f_in, in_name); reset(f_in); assign(f_out, out_name); rewrite(f_out); while not eof(f_in) do begin readln(f_in, s); if is_adding then writeln(f_out, length(s):3, ' ' + s) else writeln(f_out, copy(s, 5, length(s))); end; close(f_out); close(f_in); end; const in_name = 't.txt'; out_name = 't2.txt'; temp_1_name = '1.tmp'; temp_2_name = '2.tmp'; var f_in, f_out: text; begin action(in_name, temp_1_name, true); { Внимание, сейчас будет самое интересное !!! } swapvectors; exec(getenv('comspec'), '/c sort ' + temp_1_name + ' /O ' + temp_2_name); swapvectors; action(temp_2_name, out_name, false); { ну, тут не забываем почистить tmp -файлы, естественно... } end. |
|
Сообщ.
#13
,
|
|
|
|
хулиган
![]() обычно в таких задачах заставляют самостоятельно реализовывать сортировку. |
|
Сообщ.
#14
,
|
|
|
|
Цитата Vesper @ обычно в таких задачах заставляют самостоятельно реализовывать сортировку. код у volvo877 выглядит очень профессионально, придется поразбираться P.S. офф: с денюхой Vesper |
|
Сообщ.
#15
,
|
|
|
|
FasterHarder, значит что он делает - он создает временный файл, дописывая к каждой строке в начало ее длину, после чего вызывает внешнюю программу sort (не помню, с какой версии она есть в стандартных, так как не интересовался), она сортирует только по алфавиту, параметр -О (имя файла) указывает, куда выводить отсортированные данные (во второй временный файл в нашем случае). В результате получится файл, в котором строки упорядочены в начале по длине, потом по алфавиту. Потом он берет второй отсортированный файл и перегоняет его в файл-результат, отрезая из начала длину строки. Все
![]() PS: спасибо |
|
Сообщ.
#16
,
|
|
|
|
Цитата Vesper @ не помню, с какой версии она есть в стандартных В MS-DOS 5 уже была: MS-DOS 5.0 Internal and External Commands, так что вероятность, что ее нет там, где есть Turbo Pascal практически нулевая... |
|
Сообщ.
#17
,
|
|
|
|
Цитата FasterHarder @ как бы тебя завтра не "завернули" на сдаче . Нужно чтобы посмотрел кто нибудь из гуру, например, наш уважаемый модератор...бросил он свой глубокий взгляд на программу и промолвил: тааак сортировка строк есть... хорошо.... Всетаки не "завернули" |