Помощь - Поиск - Пользователи - Календарь
Полная версия: СРОЧНО! Сортировка массива строковых данных.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Stranger
Доброго времени суток !
Вот друг попросил накидать программку(ака 1ую часть курсовой).
Накидал, но почемуто не происходит сортировка =(
Объясните где что не так плиз (желательно asap)
вот код

program p4;
uses strings;
var
mas:array[1..10,1..2] of string ;
c,x,y,l:integer;
input,output:text;
temp:string;
begin
assign(input,'dan.txt');
reset (input);
assign(output,'res.txt');
rewrite(output);

x:=0;
Repeat
x:=x+1;
Readln(input,temp);
c:=pos(' ',temp);
l:=length(temp);
mas[x,1]:=copy(temp,1,(c-1));
mas[x,2]:=copy(temp,c+1,(l-c));
{y:=pos('r',mas[2,x]);
delete(mas[2,x],y,3);}
until EOF(input);

for y:=1 to x do begin
if mas[y,2]>mas[y+1,2] then begin
temp:=mas[y,2];
mas[y,2]:=mas[y+1,2];
mas[y+1,2]:=temp;
temp:=mas[y,1];
mas[y,1]:=mas[y+1,1];
mas[y+1,1]:=temp;

end;
end;

for y:=1 to x do writeln(output,mas[y,1],' ',mas[y,2]);

close(input);
close(output);
readln;
end.

Stranger
Да входные данные вида
door 1200
window 800
radioset 300
okno 340
computer 4000
mouse 500
keyboard 129
volvo
Цитата
почемуто не происходит сортировка =(

Потому, что "пузырек" делается в два вложенных цикла, а не в один smile.gif
For i := 1 To x Do
For j := x DownTo i+1 Do
If mas[Pred(j), 2] > mas[j, 2] Then Begin
T := mas[Pred(j), 1]; mas[Pred(j), 1] := mas[j, 1]; mas[j, 1] := T;
T := mas[Pred(j), 2]; mas[Pred(j), 2] := mas[j, 2]; mas[j, 2] := T;
End

Хотя легче, наверное определить:
var
mas:array[1 .. 10] of record
s: string; num: string;
end;

и работать с записями... Будет немного проще менять их местами...
Guest
Угу, точно... млин совсем заработался =)
Надо хотя бы иногда спать.
Пасибо.
Stranger
Интересно, возник такой лаг если сравнивать 1200 и 200, то 200 оказывается больше... Any ideas ?
volvo
Цитата(Stranger @ 22.09.2005 18:24)
возник такой лаг если сравнивать 1200 и 200, то 200 оказывается больше...
Абсолютно правильно, это вовсе не лаг, это нормальный результат при сравнении строк: '1200' < '200', т.к. строки сравниваются посимвольно, и уже первая пара символов дает '1' < '2' ... Чтобы получить результат, правильный для чисел, нужно сравнивать числа... smile.gif

Переводи строку в число (Val) и сравнивай...
Stranger
Короче вот мало ли кому нить понадобится выполнить задание аналогичное данному...

Задание
Дан список вещей с указанием цены вида: НАИМЕНОВАНИЕ_ВЕЩИ ЦЕНА
25 символов (данные в одной строке отделяются друг от друга пробелами, например: Стол 2500 руб) Выбрать три самые дорогие вещи и вывести их в файл.

1.Все исходные данные вводятся из входного текстового файла.
2.В выходной текстовый файл выводится как вся введенная информация , так и полученный результат.

Код

program p4;
const
razmermas=10;
var
mas:array[1..razmermas,1..2] of string[25] ;
x,i,j,l,c1,c2:integer;
input,output:text;
temp:string;
begin
assign(input,'dan.txt');
reset (input);
assign(output,'res.txt');
rewrite(output);

x:=0;
writeln(output,'Vhodnije dannije');
Repeat
x:=x+1;
Readln(input,temp);
j:=pos(' ',temp);
i:=length(temp);
writeln(output,temp);
mas[x,1]:=copy(temp,1,(j-1));
mas[x,2]:=copy(temp,j+1,(i-j));
i:=pos(' ',mas[x,2]);
delete(mas[x,2],i,4);
until EOF(input);


For i:=1 To x Do
For j:=x DownTo i+1 Do
begin
val(mas[pred(j),2],c1,l);
val(mas[j,2],c2,l);
If c1>c2 Then Begin
Temp:=mas[Pred(j),1];
mas[Pred(j),1]:=mas[j,1];
mas[j, 1]:=Temp;
Temp:=mas[Pred(j),2];
mas[Pred(j),2]:=mas[j,2];
mas[j,2]:=Temp;
End;
end;
writeln(output);
writeln(output,'Tri samije dorogie veshi');
c1:=0;
for i:=x downto x-2 do
begin
c1:=c1+1;
writeln(output,c1,'. ',mas[i,1],' - ',mas[i,2],' rub');
end;
close(input);
close(output);

end.

klem4
А ты уверен что эту задачу надо решать именно ТАК ? Мне кажется тут надо использовать записи ...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.