не работает функция сдвига массива

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
GanG
Сообщения: 5
Зарегистрирован: 03 авг 2013, 20:52

03 авг 2013, 23:26

:confused:

Вот собственно говоря код. Всё вроде работает, кроме функции сдвига влево. Подскажите, в чём проблема? зараннее спасибо!


program Project1;
const n=10;
type mass=array[1..n] of integer;
var A:mass;
summ:integer;
procedure input; {Процедура ввода массива}
var i:integer;
begin
for i:=1to n do
begin
writeln('Введите элемент с индексом ', i,':');
readln(A);
end;
end;
procedure output; {Процедура вывода массива на экран}
var i:integer;
begin
for i:=1 to n do writeln(A:4);
end;
procedure vlevo_sdvig; {Процедура сдвига массива влево}
var
i,x:integer;
begin
writeln('Сдвинутый влево нассив:');
i:=10;
while i<10 do
begin

if i<1 then A:=A[10] else
x:=A;
A:= A[i-1];
A[i-1]:=x ;
i:=i-2;
end;

end;
procedure poloj_elementov; {Процедура подсчёта положительных элементов}
var
i,summa:integer;
begin
Summa:=0;
for i:=1 to n do
begin
if A>0 then Summa:=Summa+1;
end;
writeln('Сумма положительных чисел: ', Summa);
end;

begin
input;
output;
vlevo_sdvig;
output;
poloj_elementov;
readln

end.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

04 авг 2013, 10:15

Потому что там написана откровенная ерунда: i=10, и цикл крутить пока i<10... Внутри цикла тоже.... Почему i изменяется с шагом 2? И, кстати, почему 10, когда для верхней границы у Вас есть специальная константа N?

Код: Выделить всё

x:=A[1];
for i:=1 to n-1 do A[i]:=A[i+1];
A[n]:=x;
три строчки, вот и весь сдвиг.

Можно было бы написать и еще короче, если бы массив был бы объявлен с запасом - не от 1 до N. А от 0 до N.
GanG
Сообщения: 5
Зарегистрирован: 03 авг 2013, 20:52

04 авг 2013, 10:45

Naeel Maqsudov писал(а):Потому что там написана откровенная ерунда: i=10, и цикл крутить пока i<10... Внутри цикла тоже.... Почему i изменяется с шагом 2? И, кстати, почему 10, когда для верхней границы у Вас есть специальная константа N?

Код: Выделить всё

x:=A[1];
for i:=1 to n-1 do A[i]:=A[i+1];
A[n]:=x;
три строчки, вот и весь сдвиг.

Можно было бы написать и еще короче, если бы массив был бы объявлен с запасом - не от 1 до N. А от 0 до N.

i изменется с шагом 2 потому что мы меняем местами два элемента
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

04 авг 2013, 10:52

Бред. Менять местами 2 элемента попарно и сдвиг влево - это совершенно разные вещи.

Если Вы хотите осуществить сдвиг путём последовательного обмена, то можно написать и так:

Код: Выделить всё

for i:=1 то n-1 do begin
   x:=a[i];
   a[i]:=a[i+1];
   a[i+1]:=x;
end;
Получится ровно тот же самый результат, но времени потребуется больше раза в 3. Поэтому, это глупо.

UPD:
Заметьте! i меняется на +1
GanG
Сообщения: 5
Зарегистрирован: 03 авг 2013, 20:52

04 авг 2013, 12:05

Naeel Maqsudov писал(а):Бред. Менять местами 2 элемента попарно и сдвиг влево - это совершенно разные вещи.

Если Вы хотите осуществить сдвиг путём последовательного обмена, то можно написать и так:

Код: Выделить всё

for i:=1 то n-1 do begin
   x:=a[i];
   a[i]:=a[i+1];
   a[i+1]:=x;
end;
Получится ровно тот же самый результат, но времени потребуется больше раза в 3. Поэтому, это глупо.

UPD:
Заметьте! i меняется на +1


Я так понял, нужно что то типа такого:
for i:=10 downto 1 do
begin
x:=A[i-1];
A[i-1]:= A;

end;
? ну а потом если i=1, то его значение ставим на А[10]
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

04 авг 2013, 20:17

Нет "типа такого" не надо.
Если не можете с массивом умозрительно, то возьмите карты, карандаши, монетки... все что угодно, и выполните над этим Вашу программу. Вы сами всё увидите.

Если Вы меняете элементы местами, то первый (или последний, если downto) элемент сам "ползёт" к противоположному концу. Итераций должно быть не 10, а N-1.

Но обмен элементов местами - это плохая практика. Это решение на 3 балла.
Я Вам выше всё написал. Менять элементы местами не надо! Надо прямо решать поставленную задачу.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

05 авг 2013, 08:29

Имхо тоже бред написан. Вообще я всегда делаю сдвиг через move - это гораздо быстрее и короче.
move(a[2], a[1], (N-1)*2)
А если он циклический, то добавляю
P := A[1];
move(a[2], a[1], (N-1)*2)
A[N] := P;
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

05 авг 2013, 09:20

Наверняка это учебный пример по теме циклы. и преподаватель скажет потом: "а где?", - и будет неловкий момент :)
Ответить