Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблемы с сортировкой!
Форум «Всё о Паскале» > 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('***‘®авЁа®ўЄ  Ї® ¬ аЄЁ Ё ¬®¤Ґ«Ё ⥫Ґд®­ ***');
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('’Ґ«Ґд®­л ®вб®авЁа®ў ­­л!');
TextAttr:=15;
readln;
close(f);
End;
2: Begin
writeln('***‘®авЁа®ўЄ  Ї® бв®Ё¬®б⨠⥫Ґд®­ ***');
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('’Ґ«Ґд®­л ®вб®авЁа®ў ­­л!');
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
Цитата
еще маленький вопрос если сортировку поменять от меньшего к большому будет работать? И как это реализовать в таком случае?
И так тоже будет работать, для этого достаточно поменять только направление знака при сравнении... А вообще - вот сюда загляни: Методы сортировок
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.