Помощь - Поиск - Пользователи - Календарь
Полная версия: СРОЧНО! Сортировка массива строковых данных.
Форум «Всё о Паскале» > 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
А ты уверен что эту задачу надо решать именно ТАК ? Мне кажется тут надо использовать записи ...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.