IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Сортировка массива
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Здравствуйте! Я написала программу сортировки массива букв шейкерной сортировкой! Но у меня программа не компилируется и ошибку выдает на 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.


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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 будет содержать измененное значение }

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Спасибо, что помогли!


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Для того, чтобы сделать так, чтобы она сортировала буквы нужно массив сделать стрингом и х сделать также стрингом. Правильно? Я сделала, но она не печатает сортированный массив. Там просто пустое место. Или я очень сильно торможу и ошибка налицо?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Спасибо! Но почему у меня при запускнии программы она не сортировала цифру 6?Все отсортировала, но 6 оставила там где она сейчас написана?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


А что я делаю не так. что когда я пишу введите строку и все остальное оставляю также, она мне даже не пытается ее отсортировать? Ведь мне нужно строку ввести! Как здесь
writeln('Vvedite stroku');
readln(s);
Или это не правильно?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата(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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Извините меня пожалуйста, но я по-моему или сошла с ума или совсем торможу. Но где мы вводим саму строку? Программе же нечего сортировать?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Это зачем?
  for I:=1 to N do
read(a[I]);
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Нет, понимаете! Мы должны ввести например "абмтрплд" и в результате программа должна нам вывести на экран "абдлмпрт", правильно или нет? Или мне нужно написать запрос введения строки и убрать ту строчку или оставить ту строчку и не писать эту?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата(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.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 14.05.2024 19:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name