На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Сортировка списка
    Здравствуйте! Не работает сортировка списка ни одним способом. Пробовал и вставками и пузырьком. Когда делаю вставками, вылезает exitcode 216 при начале обмена. В общем вот код:
    ExpandedWrap disabled
      type  el=^opisanie;
            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;
              next,prev: el;
      end;
      var
          SE: opisanie;
          s: file of opisanie;
          n,x,r,i: integer;
          kolsymb: integer;
          search1, search2: string[15];
          h,p,p1,first: el;
          tmp: string;
       
      procedure sort2;    {собственно 1 вариант}
         var i,j: integer;
         begin
            for i:=1 to (n-1) do
            begin
               p:=h;
               for j:=1 to (n-1) do
               begin
                  p1:=p^.next;
                  if p^.model > p1^.model then
                  begin
                     tmp:=p^.model;
                     p^.model:=p1^.model;
                     p1^.model:=tmp;
                  end;
               p:=p1;
               end;
            end;
            p:=h;
            for i:=1 to n do
            begin
               writeln(p^.model);
               p:=p^.next;
            end;
          end;
       
      function sortvib (var first: el):el;   {2 вариант}
         var l,p:el;
             tmp: string;
         begin
            l:=first;
            while l^.next <> nil do
            begin
               p:=l^.next;
               while p<>nil do
               begin
                  if l^.model>p^.model then
                  begin
                     tmp:=l^.model;
                     l^.model:=p^.model;
                     p^.model:=tmp;
                  end;
               p:=p^.next;
               end;
            l:=l^.next;
            end;
         end;
       
      procedure sortvs (var first: el);     {3 вариант}
         var  i,j: el;
              t: string;
         begin
            i:= first;
            while i<>nil do
            begin
               t:=i^.model;
               j:=i^.prev;
               while (j<>nil) and (t<j^.model) do
               begin
                  j^.next^.model:=j^.model;
                  j:=j^.prev;
               end;
               if j=nil then
               first^.model:=t
               else j^.next^.model:=t;
               i:=i^.next;
            end;
         end;
       
      procedure sort1 (first: el);     {4 вариант}
      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^.model < nd^.model then
                      begin
                         tmp:=sn^.model;
                         sn^.model:=nd^.model;
                         nd^.model:=tmp;
                      end;
                   sn:=sn^.next;
                end;
                nd:=nd^.next;
                end;
             end;
       
       begin
           sortvs (first); {последним этот пробовал}
       end;

    Уже больше двух недель вожусь с этим. Надо уже курсач защищать, а у меня эта сортировка неработает.
    PS. Поиском прользовался, подобное находил, от туда кстати тоже есть способ. Просьба ответить как можно быстрее..:) Прикреплённый файлПрикреплённый файлSony2.rar (1,57 Кбайт, скачиваний: 272)

    Добавлено
    Забыл совсем пользуюсь FreePascal.
      Собственно, сразу же следует вопрос: а где хоть как-то инициализируется First? Он же у тебя неинициализирован, как ты хочешь, чтоб список сортировался? Списка-то фактически и нет...
      Сообщение отредактировано: volvo877 -
        В том-то и дело, что я незнаю как его сортировать. Процедуру sort1 я взял в одной работе, там работает. Хотя переписал все учитывая, не помогло.
          Еще раз: ЧТО сортировать? Чтоб что-то сортировать, надо сначала это что-то СОЗДАТЬ. Где создается список по-твоему?
            вот здесь:
              ExpandedWrap disabled
                if n=1 then
                     begin
                     clrscr;
                     new (p);
                        writeln ('Введите описание телефона');
                        writeln;
                        writeln ('модель: ');
                        readln (p^.model);
                        for i:=1 to length(SE.model) do
                        SE.model[i]:=upcase(SE.model[i]);
                        writeln ('вес: ');
                        readln (p^.ves);
                        writeln ('тип корпуса: ');
                        readln (p^.tip_corp);
                        writeln ('диагональ дисплея: ');
                        readln (p^.dif);
                        writeln ('разрешение: ');
                        readln (p^.diag_d);
                        writeln ('встроенная память: ');
                        readln (p^.ovpam);
                        writeln ('поддержка флеш-карт: ');
                        readln (p^.f_mem);
                        writeln ('камера: ');
                        readln (p^.cam);
                        p^.next:=nil;
                        assign (s, 'D:\fp\test.txt');
                        reset (s);
                        seek (s, filesize (s));
                        write (s, p^);
                        close (s);
                        writeln ('Данные записаны.');
                        readln;
                      end;


              Добавлено
              сортировать надо по полю model, по алфавиту.

              Добавлено
              разобрался, кажется... У меня нет добавления в список елементов. Я правильно понимаю?
                Цитата MrSmmiT @
                У меня нет добавления в список елементов. Я правильно понимаю?
                Наконец то :) Да, ты правильно понимаешь.
                  можно сделать так?
                  ExpandedWrap disabled
                    procedure ad (var spis1: el; zhach1: string);
                       var
                          tmp: el;
                          begin
                             if spis1=nil then
                             begin
                                new(spis1);
                                tmp:= spis1;
                             end
                             else
                             begin
                                tmp:= spis1;
                                while tmp^.next <> nil do
                                new(tmp^.next);
                                tmp:=tmp^.next;
                             end;
                          tmp^.next:=nil;
                          tmp^.model:=zhach1;
                          end;

                  Только как сделать, чтобы добавлялись все поля (model, ves, tip_corp и т.д.)?

                  Добавлено
                  в лекции у меня написано так:
                  ExpandedWrap disabled
                    procedure Create_New_Elem(var p: el);
                       begin
                          New (p);
                          Writeln ('введите значение первого информационного поля: ');
                          Readln ( p^.inf1 );
                          Writeln ('введите значение второго информационного поля: ');
                          Readln ( p^.inf2 );
                          p^.next := nil; {все поля элемента должны быть инициализированы}
                       end;


                  Добавлено
                  Разьве оно не совпадает с моим
                  Цитата
                  ExpandedWrap disabled
                    begin
                         clrscr;
                         new (p);
                            writeln ('Введите описание телефона');
                            writeln;
                            writeln ('модель: ');
                            readln (p^.model);
                            for i:=1 to length(SE.model) do
                            SE.model[i]:=upcase(SE.model[i]);
                            writeln ('вес: ');
                            readln (p^.ves);
                            writeln ('тип корпуса: ');
                            readln (p^.tip_corp);
                            writeln ('диагональ дисплея: ');
                            readln (p^.dif);
                            writeln ('разрешение: ');
                            readln (p^.diag_d);
                            writeln ('встроенная память: ');
                            readln (p^.ovpam);
                            writeln ('поддержка флеш-карт: ');
                            readln (p^.f_mem);
                            writeln ('камера: ');
                            readln (p^.cam);
                            p^.next:=nil;
                            assign (s, 'D:\fp\test.txt');
                            reset (s);
                            seek (s, filesize (s));
                            write (s, p^);
                            close (s);
                            writeln ('Данные записаны.');
                            readln;

                  end;


                  Добавлено
                  Хотя скорее всего так что-то не так. Потому что в другой работе елементы не создавались.
                    Вроде бы сделал запись елементов.
                    ExpandedWrap disabled
                      procedure ad (var first: el);
                         var
                            p: el;
                            model, tip_corp, diag_d, dif, f_mem, cam: string[20];
                            ves, ovpam: integer;
                            begin
                               if first=nil then
                                writeln ('Введите описание телефона');
                                writeln;
                                writeln ('модель: ');
                                readln (model);
                                writeln ('вес: ');
                                readln (ves);
                                writeln ('тип корпуса: ');
                                readln (tip_corp);
                                writeln ('диагональ дисплея: ');
                                readln (diag_d);
                                writeln ('разрешение: ');
                                readln (dif);
                                writeln ('встроенная память: ');
                                readln (ovpam);
                                writeln ('поддержка флеш-карт: ');
                                readln (f_mem);
                                writeln ('камера: ');
                                readln (cam);
                               begin
                                  new(p);
                                  p^.next:=nil;
                                  p^.model:=model;
                                  p^.ves:=ves;
                                  p^.tip_corp:=tip_corp;
                                  p^.diag_d:=diag_d;
                                  p^.dif:=dif;
                                  p^.ovpam:=ovpam;
                                  p^.f_mem:=f_mem;
                                  p^.cam:=cam;
                                 { read(model);       \
                                  read(ves);           |
                                  read(tip_corp);      |
                                  read(diag_d);        |  непонимаю зачем это, оно вроде выше есть,но и без него работает (вроде)
                                  read(dif);           |
                                  read(ovpam);         |
                                  read(f_mem);         |
                                  read(cam);}         /
                               end;
                            writeln;
                            end;

                    только теперь незнаю как записать елемент в файл.
                      Вроде бы сделал запись елементов.
                      ExpandedWrap disabled
                        procedure ad (var first: el);
                           var
                              p: el;
                              model, tip_corp, diag_d, dif, f_mem, cam: string[20];
                              ves, ovpam: integer;
                              begin
                                 if first=nil then
                                  writeln ('Введите описание телефона');
                                  writeln;
                                  writeln ('модель: ');
                                  readln (model);
                                  writeln ('вес: ');
                                  readln (ves);
                                  writeln ('тип корпуса: ');
                                  readln (tip_corp);
                                  writeln ('диагональ дисплея: ');
                                  readln (diag_d);
                                  writeln ('разрешение: ');
                                  readln (dif);
                                  writeln ('встроенная память: ');
                                  readln (ovpam);
                                  writeln ('поддержка флеш-карт: ');
                                  readln (f_mem);
                                  writeln ('камера: ');
                                  readln (cam);
                                 begin
                                    new(p);
                                    p^.next:=nil;
                                    p^.model:=model;
                                    p^.ves:=ves;
                                    p^.tip_corp:=tip_corp;
                                    p^.diag_d:=diag_d;
                                    p^.dif:=dif;
                                    p^.ovpam:=ovpam;
                                    p^.f_mem:=f_mem;
                                    p^.cam:=cam;
                                   { read(model);       \
                                    read(ves);           |
                                    read(tip_corp);      |
                                    read(diag_d);        |  непонимаю зачем это, оно вроде выше есть. если убрать скобки,
                                    read(dif);           |  то после записи всех ел-ов пустые строки  и если что-то ввести, то exicode 216.
                                    read(ovpam);         |
                                    read(f_mem);         |
                                    read(cam);}         /
                                 end;
                              writeln;
                              end;

                      только теперь незнаю как записать елемент в файл.
                      После процедуры пишу:
                      ExpandedWrap disabled
                                assign (s, 'D:\fp\test.txt');
                                reset (s);
                                seek (s, filesize (s));
                                write (s, p^);
                                close (s);
                                writeln ('Данные записаны.');
                                readln;

                      но ругается на p^ в строке write (s, p^);
                        MrSmmiT, смотри:

                        ExpandedWrap disabled
                          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;
                             // тысячу раз говорил - повторяю еще раз: Мухи отдельно, котлеты - отдельно.
                             // Какое отношение имеют поля prev/next к телефону? Никакого, это доп. информация.
                             // Вот и храни эту доп. информацию там, где она нужна - это элемент списка!!!
                             // На кой ее пихать в файл? Все равно там будет записан мусор, при следующем запуске
                             // все адреса, которые были записаны раньше, поменяются, и твои prev/next будут
                             // указывать "в космос".
                             titem = record
                                data : opisanie;
                                next,prev: el;
                             end;
                           
                           
                          // ...
                           
                          procedure GetPhone(var Op : opisanie);
                          begin
                             with Op do
                             begin
                                writeln ('Введите описание телефона');
                                writeln;
                                writeln ('модель: ');
                                readln (model);
                                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 Add(var first, last : el; const Op : opisanie);
                          var p : el;
                          begin
                             new(p);
                             p^.data := Op;
                             p^.next := nil;
                             p^.prev := last;
                           
                             if first = nil then first := p
                             else last^.next := p;
                           
                             last := p;
                          end;
                        Дальше исправляй самостоятельно. Чтобы обменять значения двух элементов списка местами, теперь достаточно обменять поля data, а у тебя в sortvs менялись только модели, всё остальное оставалось на местах, в итоге получался полный бред.
                          Спасибо! Заработало!
                          Только при сравнении элемнтов пишет:
                          Operator is not overloaded: "opisanie" < "opisanie".
                          ExpandedWrap disabled
                            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<j^.data) 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;
                            Цитата MrSmmiT @
                            Только при сравнении элемнтов пишет:
                            Operator is not overloaded: "opisanie" < "opisanie".
                            Естественно. Ты не можешь сравнивать сразу всю запись с другой записью. Надо ж отсортировать по значению какого-то поля? Вот эти поля и сравнивай между собой.
                              Цитата volvo877 @
                              Вот эти поля и сравнивай между собой.

                              то есть?

                              Добавлено
                              можно пример? если не сложно.
                                Ну, если тебе надо упорядочить список по названию модели - то так:

                                ExpandedWrap disabled
                                  // ...
                                  while (j<>nil) and (t.model<j^.data.model) do
                                  // ...
                                , если надо по другому полю - сравнивай другое поле.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0591 ]   [ 19 queries used ]   [ Generated: 18.04.24, 08:02 GMT ]