Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 14:51   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

второй способ сложнее. именно для понимания (и отладки)
вот реализация:
Код:
  AllReadyIndex : integer;
  T1, T2 : Titem;
...
      writeln('sdvig massiva na k');
      write('vvedite k '); readln(k);
      if High(A) > 0 then
        K := K mod (High(A)-Low(A)+1);

      {циклический сдвиг массива вправо на K }
      jNew := Low(A);
      T1 := A[j];
      AllReadyIndex := jNew;
      for i:=Low(A) to High(A) do begin
        jNew := (jNew+k) mod  (High(A)-Low(A)+1);
        if (jNew = AllReadyIndex) and (i<High(A)) then begin
          A[jNew] := T1;
          jNew := jNew + 1;
          AllReadyIndex := jNew;
          T2 := A[jNew];
        end
        else begin
          T2 := A[jNew];
          A[jNew] := T1;
        end;
        T1 := T2;
      end;

      {вывод массива, чтобы убедиться, что сдвинулось правильно}
      writeln('Massiv A posle sdviga:');
      if High(A) > 0 then
        for i := Low(A) to High(A) do
          Write(A[i], ' ');
      WriteLn;
...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.12.2009, 14:56   #12
Saka
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 83
По умолчанию

а первый можете еще раз расписать пожалуйста
Saka вне форума Ответить с цитированием
Старый 13.12.2009, 15:22   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а первый можете еще раз расписать пожалуйста
ох... пользуетесь Вы моей добротой...

Код:
  procedure ShiftArrayRight(var AA : Tdar);
  var i : integer;
      T : Titem;
  begin
    T := AA[High(AA)];
    for i:=High(AA) downto Low(AA)+1 do
      AA[i] := AA[i-1];
    AA[Low(AA)] := T
  end;

.....

      writeln('sdvig massiva na k');
      write('vvedite k '); readln(k);
      if High(A) > 0 then
        K := K mod (High(A)-Low(A)+1);

      {циклический сдвиг массива вправо на K }
      for i:=1 to K do
        ShiftArrayRight( A );
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.12.2009, 15:58   #14
Saka
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 83
По умолчанию

пожалуйста напишите не через процедуры первый способ, я их не знаю пока
Saka вне форума Ответить с цитированием
Старый 13.12.2009, 16:12   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

это ж совсем просто..
Код:
      {циклический сдвиг массива вправо на K }
      for i:=1 to K do begin
        T1 := A[High(A)];
        for j := High(A) downto Low(A)+1 do
           A[j] := A[j-1];
        A[Low(A)] := T1
      end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.12.2009, 16:43   #16
Saka
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 83
По умолчанию

Вот сам код проги, вот только после сдвига бред выдает. незнаю причину
Код:
program Project11;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type
Titem=longint;
TDar=array of Titem;
Var
x,T1,w,p,n,k,j,i:longint;
c,A,B:Tdar;
T:Titem;
fl:boolean;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
Begin
repeat
  writeln('Vvedite kol-vo elementov'); readln(n);
until n>0;
setLength(A,n);
i:=Low(A);
randomize;
repeat
A[i]:=random(100);
inc(i);
until i>High(A);
writeln('Massiv A');
if High(A)>=0 then
for i := Low(A) to High(A) do
  Write(A[i],' ') else
writeln('there are no elements');
writeln;
i:=Low(A);
k:=0;
repeat
begin
  inc(k);
Setlength(B,k);
B[k-1]:=A[i];
End;
inc(i);
until i>High(A);
writeln('Massiv B iz A:');
if High(b)>=0 then
 for i:=Low(B) to High(B) do
write(B[i],' ')
else
begin
write('there are no elements');
readln;
End;
writeln;


      for i:=Low(A) to High(A) do
      begin
        x := A[i];
        while (x > 0) do
        begin
          N := x mod 10;
          x := x div 10;
          if (n=5) then begin
            A[i] := 0;
            x := 0; {это чтобы выйти из цикла}
          end;
        end;
      end;

for i:=Low(B) to High(B) do
write(A[i],' ');
writeln;

  end;
  readln;
writeln('vvedite k');
readln(k);
for i:=1 to k do
T1 := A[High(A)];
        for j := High(A) downto Low(A)+1 do
           A[j] := A[j-1];
        A[Low(A)] := T1;
        for i:=1 to n do        write(A[i],' ');
  finally

  end;
readln;
end.
Saka вне форума Ответить с цитированием
Старый 13.12.2009, 17:32   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

begin end потеряли! в цикле выполнялась только одна строка!!!
Код:
for i:=1 to k do
begin
  T1 := A[High(A)];
        for j := High(A) downto Low(A)+1 do
           A[j] := A[j-1];
        A[Low(A)] := T1;
end;

а потом уже вывод результата:

      writeln('Massiv A posle sdviga:');
      if High(A) > 0 then
        for i := Low(A) to High(A) do
          Write(A[i], ' ');
      WriteLn;
p.s. а зачем Вы использовали блок try ... finally !?!? o_O
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.12.2009, 17:41   #18
Saka
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 83
По умолчанию

Спасибо огромное за помощь)))
Saka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с кодом judge_arm Microsoft Office Excel 2 01.07.2009 11:48
Помогите с кодом lewka-serdceed Общие вопросы Delphi 1 22.06.2009 00:25
Помогите с кодом prostoCHEL Общие вопросы Delphi 4 02.03.2008 21:56