1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Здравствуйте! Я написала программу сортировки массива букв шейкерной сортировкой! Но у меня программа не компилируется и ошибку выдает на 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.
--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.
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 будет содержать измененное значение }
Для того, чтобы сделать так, чтобы она сортировала буквы нужно массив сделать стрингом и х сделать также стрингом. Правильно? Я сделала, но она не печатает сортированный массив. Там просто пустое место. Или я очень сильно торможу и ошибка налицо?
--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.
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 не должен содержать ничего кроме имени самого сортируемого массива - это лишняя информация...
А что я делаю не так. что когда я пишу введите строку и все остальное оставляю также, она мне даже не пытается ее отсортировать? Ведь мне нужно строку ввести! Как здесь writeln('Vvedite stroku'); readln(s); Или это не правильно?
--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.
Но почему у меня при запускнии программы она не сортировала цифру 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.
Нет, понимаете! Мы должны ввести например "абмтрплд" и в результате программа должна нам вывести на экран "абдлмпрт", правильно или нет? Или мне нужно написать запрос введения строки и убрать ту строчку или оставить ту строчку и не писать эту?
--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.
Для того, чтобы сделать так, чтобы она сортировала буквы нужно массив сделать стрингом и х сделать также стрингом. Правильно? Я сделала, но она не печатает сортированный массив. Там просто пустое место. Или я очень сильно торможу и ошибка налицо?
тогда здесь неверное определение для того, чтобы работала сортировка ОДНОЙ строки, нужно представить ее как сортировку СИМВОЛОВ этой строки
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);