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

Procedure Sortirovka;
var
  T:ykazatel;
  k,i,j:integer;
  st:array[1..30] of ykazatel;
Begin
  RestoreCrtMode;
  assign(f,filename);
  reset(f);
  case z of
  1: Begin
       writeln('***‘(r)авЁа(r)ўЄ  Ї(r) ¬ аЄЁ Ё ¬(r)¤Ґ«Ё ⥫Ґд(r)­ ***');
       Delay(50000);
       k:=1;
       while not eof(f) do
         Begin
           read(f,st[k]);
           k:=k+1;
         End;
       Begin
         For i:=1 to n do
           Begin
             For j:=1 to n do
               If st[j].MobileMark<st[j+1].MobileMark then
                 Begin
                   T:=st[j];
                   st[j]:=st[j+1];
                   st[j+1]:=T;
                 End;
           End;
       End;
     For i:=1 to n do
           Begin
             For j:=1 to n do
               If st[j].MobileMark=st[j+1].MobileMark then
               If st[j].Mobile<st[j+1].Mobile then
                 Begin
                   T:=st[j];
                   st[j]:=st[j+1];
                   st[j+1]:=T;
                 End;
               End;
               close(f);
     rewrite(f);
     For j:=n downto 1 do
       Begin
         write(f,st[j]);
         read;
       End;
     TextAttr:=2;
     writeln('’Ґ«Ґд(r)­л (r)вб(r)авЁа(r)ў ­­л!');
     TextAttr:=15;
     readln;
     close(f);
     End;
  2: Begin
       writeln('***‘(r)авЁа(r)ўЄ  Ї(r) бв(r)Ё¬(r)б⨠⥫Ґд(r)­ ***');
       Delay(50000);
       k:=1;
       while not eof(f) do
         Begin
           read(f,st[k]);
           k:=k+1;
         End;

       Begin
         For i:=1 to n do
           Begin
             For j:=1 to n do
               If st[j].Cost<st[j+1].Cost then
                 Begin
                   T:=st[j];
                   st[j]:=st[j+1];
                   st[j+1]:=T;
                 End;
           End;
       End;
       close(f);
     rewrite(f);
     For j:=n downto 1 do
       Begin
         write(f,st[j]);
         read;
       End;
     TextAttr:=2;
     writeln('’Ґ«Ґд(r)­л (r)вб(r)авЁа(r)ў ­­л!');
     TextAttr:=15;
     readln;
     close(f);
     End;
  End;
  SetGraphMode(GetGraphMode);
End;

Lapp
Spaun, твоя процедура достаточно длинная, желательно, чтоб она компилировалась. Глазами трудно смоделировать работу программы такого размера. Добавь недостающие типы и перменные.

Добавлено через 2 мин.
А также очень желательно присовокупить файл, который она читает.
Спасибо.
volvo
Spaun, зачем усложняешь себе же жизнь, используя поэлементное копирование структуры? Что,
Цитата
               If st[j].Mobile<st[j+1].Mobile then
                 Begin
                   x1:=st[j].MobileMark;
                   x2:=st[j].Mobile;
                   x3:=st[j].Cost;
                   x4:=st[j].Data;
                   x5:=st[j].Kamera;
                   x6:=st[j].Wap;
                   x7:=st[j].Usb;
                   st[j].MobileMark:=st[j+1].MobileMark;
                   st[j].Mobile:=st[j+1].Mobile;
                   st[j].Cost:=st[j+1].Cost;
                   st[j].Data:=st[j+1].Data;
                   st[j].Kamera:=st[j+1].Kamera;
                   st[j].Wap:=st[j+1].Wap;
                   st[j].Usb:=st[j+1].Usb;
                   st[j+1].MobileMark:=x1;
                   st[j+1].Mobile:=x2;
                   st[j+1].Cost:=x3;
                   st[j+1].Data:=x4;
                   st[j+1].Kamera:=x5;
                   st[j+1].Wap:=x6;
                   st[j+1].Usb:=x7;
                 End;

выглядит внушительнее, чем
var T: ykazatel;
...
               If st[j].Mobile<st[j+1].Mobile then begin
                   T := st[j]; st[j] := st[j + 1]; st[j + 1] := T;
               End;

? Я тебя уверяю, работать быстрее твой вариант не будет, а вот сложности при отладке возникнут обязательно... В принципе, уже возникли smile.gif

Update
+ к этому, в FAQ-е был выложен пример, как заставить одну и ту же процедуру сортировать массив записей по РАЗНЫМ полям... Полюбопытствуй, это как раз то, что тебе нужно...
Spaun
Lapp
Вот!
Spaun
Цитата(volovo)

выглядит внушительнее, чем

var T: ykazatel;
...
               If st[j].Mobile<st[j+1].Mobile then begin
                   T := st[j]; st[j] := st[j + 1]; st[j + 1] := T;
               End;



? Я тебя уверяю, работать быстрее твой вариант не будет, а вот сложности при отладке возникнут обязательно... В принципе, уже возникли


Спасибо за совет но именно моей проблеме это не помогло, хотя и уменьшило код. Если есть какие-нибудь идеи по основной проблеме, пожалуйста помогите.
volvo
Цитата
Если есть какие-нибудь идеи по основной проблеме, пожалуйста помогите.
Присоедини исходник, а не EXE-шник, поможем...
Spaun
volovo
Вот!
volvo
Бррр... Так... Поскольку твоя программа на моем компиляторе не отрабатывает, как положено (Access Denied вылетает), а запускать TP неохота, то давай ты сам попробуешь прочитать из файла и отсортировать вот так:
k:=0;
while not eof(f) do begin
	inc(k);
	read(f,st[k]);
end;

for i:=1 to k do begin
	for j:=k downto i+1 do
		If st[j].MobileMark<st[j-1].MobileMark then begin
			T:=st[j]; st[j]:=st[j-1]; st[j-1]:=T;
		end;
end;

for i:=1 to k do begin
	for j:=k downto i+1 do
		If st[j].MobileMark=st[j-1].MobileMark then
			If st[j].Mobile<st[j-1].Mobile then begin
				T:=st[j]; st[j]:=st[j-1]; st[j-1]:=T;
			end;
end;
, согласно алгоритму сортировки "пузырьком", и проверишь, работает ли оно... Если нет - говори...
Spaun
volvo Все огромное спасибо!!! Работает, да еще маленький вопрос если сортировку поменять от меньшего к большому будет работать? И как это реализовать в таком случае?
volvo
Цитата
еще маленький вопрос если сортировку поменять от меньшего к большому будет работать? И как это реализовать в таком случае?
И так тоже будет работать, для этого достаточно поменять только направление знака при сравнении... А вообще - вот сюда загляни: Методы сортировок
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.