Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка массива
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
setare
Здравствуйте! Я написала программу сортировки массива букв шейкерной сортировкой! Но у меня программа не компилируется и ошибку выдает на for downto. Не могли бы вы сказать в чем дело! Вот код! Заранее благодарю!

Код
program Sheikernaya_sortirovka;
const N=10;
type
 mas=array[0..N] of integer;

procedure sheiker(var J,L:integer;var a:mas);
var
 x,K,R:integer;
begin
 L:=2;
 R:=N;
 K:=N;
 repeat
   for J:=R downto L do
     if a[J-1]>a[J] then begin
       x:=a[J-1];
       a[J-1]:=a[J];
       a[J]:=x;
       K:=J
     end;
   L:=K+1;
   for J:=L to R do
     if a[J-1]>a[J] then begin
       x:=a[J-1];
       a[J-1]:=a[J];
       a[J]:=x;
       K:=J
     end;
   R:=K-1
 until L>R;
end;

var
 J,L,K,R,X,N,I:integer;
 s:string[50];
begin
 writeln('Vvedite stroku'); readln(s);
 for I:=1 to N do read(a[I]);
 sheiker(J,L,a);
 writeln('Result:');
 for I:=1 to N do write(a[I],' ')
end.
volvo
procedure sheiker(var J,L:integer;var a:mas);
...
for J:=R downto L do
if a[J-1]>a[J] then...


:no: так нельзя делать... По определению переменной цикла For должна быть локальная переменная... А что у Вас? Переменная, передаваемая по ссылке в процедуру локальной никак быть не может...

Но если уж так нужно вернуть значение J в вызывающую программу, я бы сделал так:
procedure sheiker(var J,L:integer;var a:mas);
var
x,K,R, JJ:integer;
...
{ Дальше работа не с "J" а с "JJ", а перед выходом из процедуры: }
J := JJ; { таким образом J будет содержать измененное значение }

setare
Спасибо, что помогли!
setare
Для того, чтобы сделать так, чтобы она сортировала буквы нужно массив сделать стрингом и х сделать также стрингом. Правильно? Я сделала, но она не печатает сортированный массив. Там просто пустое место. Или я очень сильно торможу и ошибка налицо?
volvo
setare, смотрите, что я делаю в таких случаях:
program Sheikernaya_sortirovka;
const
n = 8;

type
TType = string;
{ теперь для изменения типа сортируемых переменных
достаточно изменить TType... Все остальное изменится само }

{ Вот тут была логическая ошибка: не от 0, а от 1...
Если сделать от 0, сортировка работать перестанет }
mas = array[1 .. n] of TType;

procedure sheiker(var a: mas);

{ Ну, это по желанию, но по-моему проще записать swap,
чем каждый раз писать 3 строки... }
procedure swap(var x, y: TType);
var T: TType;
begin
T := x; x := y; y := T
end;

var
K,R,J,L:integer;
X: TType; { Это будет того типа, что нужно }
begin
L:=2;
R:=N;
K:=N;
repeat
for J:=R downto L do
if a[J-1]>a[J] then begin
swap(a[j], a[j-1]); { 1 строка вместо 3-х... }
K:=J
end;
L:=K+1;
for J:=L to R do
if a[J-1]>a[J] then begin
swap(a[j], a[j-1]); { ... и здесь тоже }
K:=J
end;
R:=K-1
until L>R;
end;

var
i: integer;

{ это для проверки работы со строками }
const
a: mas = ('44', '55', '12', '42', '94', '18', '6', '67');
begin
{
for I:=1 to N do
read(a[I]);
}
sheiker(a);
writeln('Result:');
for I:=1 to N do
write(a[I],' ')
end.



Кстати, вызов Sheiker не должен содержать ничего кроме имени самого сортируемого массива - это лишняя информация... smile.gif
setare
Спасибо! Но почему у меня при запускнии программы она не сортировала цифру 6?Все отсортировала, но 6 оставила там где она сейчас написана?
setare
А что я делаю не так. что когда я пишу введите строку и все остальное оставляю также, она мне даже не пытается ее отсортировать? Ведь мне нужно строку ввести! Как здесь
writeln('Vvedite stroku');
readln(s);
Или это не правильно?
volvo
Цитата(setare @ 29.04.05 19:04)
Но почему у меня при запускнии программы она не сортировала цифру 6? Все отсортировала, но 6 оставила там где она сейчас написана?

Не цифру 6, а строку со значением '6' ...

Вот что программа выдает: "12 18 42 44 55 6 67 94", то есть с точки зрения сортировки строк все абсолютно правильно... Как сортируются строки? Сначала - по первому символу, потом (если первый символ у обеих строк одинаковый - по второму), и т.д. Так что массив строк отсортирован как положено... :yes:

Цитата(setare @ 29.04.05 19:13)
Ведь мне нужно строку ввести! Или это не правильно?

:no: Не строку, а массив строк !!! Замените основную программу вот на это:
{ это для проверки работы со строками }
var a: mas;
begin
for I:=1 to N do
read(a[I]);
sheiker(a);
writeln('Result:');
for I:=1 to N do
write(a[I],' ')
end.
setare
Извините меня пожалуйста, но я по-моему или сошла с ума или совсем торможу. Но где мы вводим саму строку? Программе же нечего сортировать?
volvo
Это зачем?
  for I:=1 to N do
read(a[I]);
setare
Нет, понимаете! Мы должны ввести например "абмтрплд" и в результате программа должна нам вывести на экран "абдлмпрт", правильно или нет? Или мне нужно написать запрос введения строки и убрать ту строчку или оставить ту строчку и не писать эту?
volvo
Цитата(setare @ 29.04.05 18:19)
Для того, чтобы сделать так, чтобы она сортировала буквы нужно массив сделать стрингом и х сделать также стрингом. Правильно? Я сделала, но она не печатает сортированный массив. Там просто пустое место. Или я очень сильно торможу и ошибка налицо?

тогда здесь неверное определение smile.gif для того, чтобы работала сортировка ОДНОЙ строки, нужно представить ее как сортировку СИМВОЛОВ этой строки smile.gif

меняем заголовок Shaker:
Type TType = Char;
procedure sheiker(var a: mas; const n: integer);

и саму основную программу:
var
s: string;
a: mas;
begin
writeln('Vvedite stroku');
readln(s);
for i := 1 to length(s) do
a[i] := s[i];

sheiker(a, length(s));
writeln('Result:');
for I:=1 to length(s) do
write(a[I]);
end.


Добавлено позже:
Или переписать программу вот так:
program Sheikernaya_sortirovka;
type
TType = char;

procedure sheiker(var a: array of TType;
const n: integer);

procedure swap(var x, y: TType);
var T: TType;
begin
T := x; x := y; y := T
end;

var
K,R,J,L:integer;
X: TType;
begin
L:=2;
R:=N;
K:=N;
repeat
for J:=R-1 downto L-1 do
if a[J-1]>a[J] then begin
swap(a[j], a[j-1]);
K:=J
end;
L:=K+1;
for J:=L-1 to R-1 do
if a[J-1]>a[J] then begin
swap(a[j], a[j-1]);
K:=J
end;
R:=K-1
until L>R;
end;

var
s: string;
begin
writeln('Vvedite stroku');
readln(s);

sheiker(s[1], length(s));
writeln('Result:');
writeln(s);
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.