На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Сортировка списка
    А как сделать, чтобы записанные ранее элементы брались из файла. Т.е. ввели элеменыты списка, они записались в файл, закрыли программу. Потом открыли и отсортировали то что записано в файле. Проще говоря, как взять элементы для списка из файла для сортировки.
    Уже все кроме этого работает:
    ExpandedWrap disabled
      Program Sony;
      Uses heaptrc, lineinfo, crt;
      type  el=^titem;
            opisanie= record
              model: string[20];
              ves: integer;
              tip_corp: string[20];
              diag_d: string[10];
              dif: string[10];
              f_mem: string[5];
              cam: string[10];
              ovpam: integer;
            end;
            titem=record
              data: opisanie;
              next, prev: el;
            end;
      var
          SE: opisanie;
          s: file of opisanie;
          n,x,r,i: integer;
          kolsymb: integer;
          search1, search2: string[15];
          p,p1,first,last: el;
       
      procedure getphone (var SE: opisanie);
         var i: integer;
         begin
            with SE do
            begin
               writeln ('Введите описание телефона');
               writeln;
               writeln ('модель: ');
               readln (model);
               for i:=1 to length (SE.model) do
               SE.model[i]:=upcase(SE.model[i]);
               writeln ('вес: ');
               readln (ves);
               writeln ('тип корпуса: ');
               readln (tip_corp);
               writeln ('диагональ дисплея: ');
               readln (diag_d);
               writeln ('разрешение: ');
               readln (dif);
               writeln ('встроенная память: ');
               readln (ovpam);
               writeln ('поддержка флеш-карт: ');
               readln (f_mem);
               writeln ('камера: ');
               readln (cam);
            end;
         end;
       
       
      procedure ad (var first, last: el; const SE: opisanie);
         var p: el;
         begin
            new(p);
            p^.data:=SE;
            p^.next:=nil;
            p^.prev:=last;
            if first=nil then
            first:=p
            else
            last^.next:=p;
            last:=p
         end;
       
      procedure sortvs (var first: el);
         var  i,j: el;
              t: opisanie;
         begin
            i:= first;
            while i<>nil do
            begin
               t:=i^.data;
               j:=i^.prev;
               while (j<>nil) and (t.model<j^.data.model) do
               begin
                  j^.next^.data:=j^.data;
                  j:=j^.prev;
               end;
               if j=nil then
               first^.data:=t
               else j^.next^.data:=t;
               i:=i^.next;
            end;
         end;
       
      procedure view (first: el);
         var nd: el;
             l: string;
         begin
            nd:=first;
            if nd=nil then
            writeln ('‘ЇЁб®Є Їгбв')
            else
            begin
               while nd<>nil do
               begin
                  write(nd^.:15);
                  nd:=nd^.next;
               end;
            end;
         end;
      {procedure sort1 (first: el);
      var sn,nd: el;
          tmp: string;
          begin
             getmem(sn, sizeof(opisanie));
             nd:=first;
             while nd<>nil do
             begin
                sn:=nd^.next;
                while sn<>nil do
                begin
                   if sn^.data < nd^.data then
                      begin
                         tmp:=sn^.data;
                         sn^.data:=nd^.data;
                         nd^.data:=tmp;
                      end;
                   sn:=sn^.next;
                end;
                nd:=nd^.next;
                end;
             end;}
       
        begin
              repeat
              clrscr;
                writeln ('            МЕНЮ');
                writeln;
                writeln ('1 - добавить информацию о телефоне');
                writeln ('2 - просмотр списка телефонов');
                writeln ('3 - поиск');
                writeln ('4 - сортировка по алфавиту');
                writeln ('5 - выход');
                readln (n);
       
      if n=1 then
           begin
              getphone (SE);
              ad (first, last, SE);
              assign (s, 'D:\fp\test.txt');
              reset (s);
              seek (s, filesize (s));
              write (s, SE);
              close (s);
              writeln ('„ ­­лҐ б®еа ­Ґ­л ў д ©«');
              readln;
       
           end;
      if n=2 then
           begin
              assign (s, 'D:\fp\test.txt');
              reset (s);
              writeln ('       модель   вес   тип корпуса    разрешение   диагональ   память  флеш-карта    камера ');
              while not eof (s) do
              with SE do
              begin
                read (s, SE);
                writeln (model:12,'', ves:7,'', tip_corp:11,'', dif:15,'', diag_d:11, ovpam:11,'', f_mem:10,'', cam:12);
              end;
              readln;
              close (s);
           end;
      if n=3 then
           begin
           clrscr;
              writeln ('Введите модель телефона');
              readln (search1);
              kolsymb:= length (search1);
              assign (s, 'D:\\fp\test.txt');
              reset (s);
              while not eof (s) do
                 begin
                 read (s, SE);
                 search2:= copy(SE.model,1,kolsymb);
                 if (upcase(search1)=upcase(search2)) then
                    begin
                       writeln ('модель - ', SE.model);
                       writeln ('вес - ', SE.ves, '':1, 'гр.');
                       writeln ('тип корпуса  - ', SE.tip_corp);
                       writeln ('диагональ дисплея - ', SE.diag_d, '':1, 'inch');
                       writeln ('поддержка флеш-карт', SE.f_mem);
                       writeln ('камера  - ', SE.cam, '':1, 'Mpix');
                       writeln ('встроенная память - ', SE.ovpam, '':1, 'Mb')
                    end;
                 end;
              close (s);
              readln;
           end;
      if n=4 then
           begin
              sortvs (first);
           end;
      if n=5 then
           view (first);
      until n>5;
      end.


    Добавлено
    volvo877Очень прошу поскорее ответить! :rolleyes:
      ExpandedWrap disabled
        begin // основная программа
           first := nil; last := nil;
         
           // Тут можно добавить проверку существования файла, и загружать из него данные
           // только если файл существует, чтоб при первом вызове не было сбоя
           assign (s, 'D:\fp\test.txt'); // Этого достаточно, не надо делать Assign каждый раз, остальные Assign-ы можешь убрать
           reset (s);
           while not eof (s) do
           begin
              read (s, SE);
              ad (first, last, SE)
           end;
           close (s);
         
           repeat
              clrscr; // далее - по тексту


      P.S. Почему ты делаешь просмотр списка телефонов из файла - непонятно. Печатай прямо список:

      ExpandedWrap disabled
        writeln ('       модель   вес   тип корпуса    разрешение   диагональ   память  флеш-карта    камера ');
        p := first;
        while p <> nil do
        begin
           with p^.data do
              writeln (model:12,'', ves:7,'', tip_corp:11,'', dif:15,'', diag_d:11, ovpam:11,'', f_mem:10,'', cam:12);
           p := p^.next;
        end;
      не проще?
        Проще, но это все приблуды преподавателя.
        Сортировка видимо как-то не так работает.
        Вот что было в файле до сортировки:
        user posted image
        И вот что стало после:
        user posted image
          Кажется понял почему так. Я открываю файл, беру оттуда записи, сортирую это все. И записывается оно туда же, не стирая того, что уже есть в файле. Если это так, то как это можно исправить?
            Цитата MrSmmiT @
            Я открываю файл, беру оттуда записи, сортирую это все. И записывается оно туда же, не стирая того, что уже есть в файле.
            Ты знаешь, я не телепат. Я в твоем коде вообще не вижу записи в файл после сортировки, и сказать, как исправить - не могу. Теоретически - перед записью в файл отсортированных данных достаточно содержимое файла удалить:

            ExpandedWrap disabled
              reset(s);
              truncate(s);
              // и только теперь записывать данные
            , а практически - надо видеть код. Я его не вижу.
              Процедура сортировки осталась та же,
              ExpandedWrap disabled
                begin
                        first:=nil;
                        last:=nil;
                        repeat
                        clrscr;
                          writeln ('            МЕНЮ');
                          readln (n);
                         \\ и так далее до
                if n=4 then
                     begin
                        assign (s, 'D:\fp\test.txt');
                        reset (s);
                        while not eof (s) do
                        begin
                           read (s, SE);
                           sortvs (first);
                           write (s, SE);
                        end;
                        close (s);
                     end;


              Добавлено
              Попробовал с
              ExpandedWrap disabled
                truncate(s);

              получается тоже самое... все записи заменились одной. Видимо не в этом дело. Хотя новой строки не добавилось.
              Вот на всякий случай еще процедура сортировки:
              ExpandedWrap disabled
                procedure sortvs (var first: el);
                   var  i,j,k: el;
                        t: opisanie;
                   begin
                      i:= first;
                      while i<>nil do
                      begin
                         t:=i^.data;
                         j:=i^.prev;
                         while (j<>nil) and (t.model<j^.data.model) do
                         begin
                            j^.next^.data:=j^.data;
                            j:=j^.prev;
                         end;
                         if j=nil then
                         first^.data:=t
                         else j^.next^.data:=t;
                         i:=i^.next;
                      end;
                   end;


              Добавлено
              еще заметил, что после добавления от 3 до н записей в файл. Сортировка работает не так: остается только первая запись, и она написана 2 раза.
                Запись списка в файл:
                ExpandedWrap disabled
                       begin
                          getphone (SE);
                          ad (first, last, SE);
                          assign (s, 'D:\fp\test.txt');
                          reset (s);
                          seek (s, filesize (s));
                          getmem (p, sizeof(titem));
                          write (s, p^.data);
                          close (s);
                          writeln ('Данные сохранены в файл');
                          readln;

                после этой "записи", при просмотре содержимого файла пишется не модель, вес и т.д., а чушь какая-то.
                Помогите пожалуйста!
                  Цитата MrSmmiT @
                  после этой "записи", при просмотре содержимого файла пишется не модель, вес и т.д., а чушь какая-то.

                  С этим разобрался. Теперь только непонятно почему после добавления последнего элемента, перезаписываются все предыдущие на вводимый.
                  И нельзя просмотреть содержимое файла, пока не добавишь новый элемент.
                  Ответте пожалуйста быстрее, мне в понедельник уже сдавать надо... :rolleyes: :blush:
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0368 ]   [ 16 queries used ]   [ Generated: 19.04.24, 01:34 GMT ]