На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Сортировка строк текстового файла
    Всем доброго времени суток! На завтра "вручили" задание но самому розобратся к сожаление времени не хватает =( очень надеюсь на помощь...

    Написать програму уорядочевающую строки символов текстового файла от наим. до наиб. результат вывести на экран и в другой текстовый файл.
      Цитата Pr0bl3matic @
      уорядочевающую строки символов текстового файла от наим. до наиб. результат вывести на экран и в другой текстовый файл.

      а вы можете пример на пАльцах привести, а то как то мутно имхо :no:
        есть у нас некий файл похожего содержания:

        блаблабла блаблабла блабла
        блабла бла
        блаблабла блабла бла

        и его строки нужно упорядочить чтобы получилось:
        блабла бла
        блаблабла блабла бла
        блаблабла блаблабла блабла

        и эту всю беду вывести на экран и в отдельный файлик, вроде так;)
          т е нужно отсортировать по длине строк?(а из чего он состоит не важно?)
            угу, по длине... хз в задании четко не написано знач не важно=)
              вот мой вариант, на самом деле столкнулся со сложностью , т к думал что файл типизированный, а оказалось текстовый, поэтому возможно это полный изврат и "подстановка", т е я перевел действие на параллельные массивы, в общем посмотри:
              ExpandedWrap disabled
                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.


              можешь создать исходный файл примерно такое структуры:
              ExpandedWrap disabled
                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');
              Сообщение отредактировано: FasterHarder -
                Огромное спасибо! Изврат не изврат... работает? работает!(в даной ситуации это главное) еще раз спасибо=)
                  как бы тебя завтра не "завернули" на сдаче :lol: . Нужно чтобы посмотрел кто нибудь из гуру, например, наш уважаемый модератор.
                    не освобождается память - лучше все-таки сделать освобождение в конце программы. Плюс ограничение на макс. размер файла... ну это некритично, для того уровня, куда понесена задача :) А так вроде всё на месте. Медленно, да, но всё же.
                      thank's Vesper, действительно про освобождение памяти подзабыл(частенько кстати забываю, нужно в паскаль прикрурить свой GC - garbage collector :D _). А что касается скорости, как можно это улучшить? Подскажите как быть то?

                      P.S. честно говоря думал, что это "изврат", т к перенес логику на параллельные массивы :no:
                        например, вести счетчик сделанных перестановок, и если он остался 0 после прохождения по массиву, выходить из сортировки.
                        С одной стороны длину можно динамически вычислять, с другой - это будет дольше, придется лопатить в 128 раз больше инфы каждый цикл.
                        Нормальная логика, по-моему.
                          А что, обязательно делать сортировку самому? Встроенные в ОС функции - по боку? ;) Тогда зачем они вообще?

                          ExpandedWrap disabled
                            {$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.
                            хулиган :)
                            обычно в таких задачах заставляют самостоятельно реализовывать сортировку.
                              Цитата Vesper @
                              обычно в таких задачах заставляют самостоятельно реализовывать сортировку.

                              код у volvo877 выглядит очень профессионально, придется поразбираться ;)

                              P.S. офф: с денюхой Vesper ;)
                              Сообщение отредактировано: FasterHarder -
                                FasterHarder, значит что он делает - он создает временный файл, дописывая к каждой строке в начало ее длину, после чего вызывает внешнюю программу sort (не помню, с какой версии она есть в стандартных, так как не интересовался), она сортирует только по алфавиту, параметр -О (имя файла) указывает, куда выводить отсортированные данные (во второй временный файл в нашем случае). В результате получится файл, в котором строки упорядочены в начале по длине, потом по алфавиту. Потом он берет второй отсортированный файл и перегоняет его в файл-результат, отрезая из начала длину строки. Все :)
                                PS: спасибо :)
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.0865 ]   [ 14 queries used ]   [ Generated: 23.09.26, 05:57 GMT ]