Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Двумерные массивы и процедуры PASCAL (http://www.tehnari.ru/f41/t36969/)

kuzlar 13.06.2010 15:54

Двумерные массивы и процедуры PASCAL
 
Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз ( в зависимости от режима ) n может быть больше количества элементов в строке или стобце ( оформить в виде процедуры ) :tehnari_ru_281:

MrSTEP 13.06.2010 16:57

Во-первых, не очень понятно
Цитата:

вправо или вниз ( в зависимости от режима )
Как задается режим?

Во-вторых, где ваши наработки (наброски)? Выкладывайте, мы поможем, исправим

Vladimir_S 13.06.2010 20:27

MrSTEP, я смиренно прошу извинения, что встреваю, но просто меня задачка заинтересовала. А задачка-то ох, не простая! Сам провозился больше часа.
Как я понимаю, речь идет вот о чем. Пусть есть прямоугольная матрица. Нужно сдвинуть нумерацию элементов либо "вправо", т.е. каждый элемент строки занимает место сдвинутого в строке на n позиций с переходом на следующую строку, последних элементов - на начало матрицы, ну или "вниз" - это когда тоже самое, но по столбцам.
Вот что у меня получилось:
Код:

Const
 M0=4;
 N0=5;
VAR
 A1,A2:ARRAY[1..M0,1..N0] of BYTE;
 B1,B2:ARRAY[1..M0*N0] of BYTE;
 n:WORD;
 i,j,k:Integer;
 C:Char;
BEGIN
 RANDOMIZE;

 For i:=1 to M0 do
  For j:=1 to N0 do
  A1[i,j]:=Random(100);

 Writeln('Initial matrix:');
 For i:=1 to M0 do
  begin
  For j:=1 to N0 do
    Write(A1[i,j]:4);
  WriteLn;
  end;

 WriteLn;

 WriteLn('Enter the regime - Right (R) or Down (D):');
 ReadLn(C);

 Write('Enter the Shift ');
 ReadLn(n);

 If (C='R') or (C='r') then
  begin
  For i:=1 to M0 do
    For j:=1 to N0 do
    B1[(i-1)*N0+j]:=A1[i,j];
  end else
  begin
  For j:=1 to N0 do
    For i:=1 to M0 do
    B1[(j-1)*M0+i]:=A1[i,j];
  end;

  For i:=1 to M0*N0 do
  begin
    If (i+n)<=M0*N0 then k:=(i+n) else
    If ((i+n) mod (M0*N0))=0 then k:=M0*N0 else   
    k:=((i+n) mod (M0*N0));
    B2[k]:=B1[i];
  end;

 If (C='R') or (C='r') then
  begin
  For i:=1 to M0 do
    For j:=1 to N0 do
    A2[i,j]:=B2[(i-1)*N0+j];
  end else
  begin
  For j:=1 to N0 do
    For i:=1 to M0 do
    A2[i,j]:=B2[(j-1)*M0+i];
  end;

  WriteLn;

  WriteLn('"Shifted" matrix:');
  For i:=1 to M0 do
  begin
    For j:=1 to N0 do
    Write(A2[i,j]:4);
    WriteLn;
  end;

 ReadLn;

END.

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

MrSTEP 13.06.2010 20:46

Цитата:

MrSTEP, я смиренно прошу извинения, что встреваю
нет смысла в извинениях, на этом форуме ты правишь бал :)

А задача действительно интересная, чей самому попробовать

Vladimir_S 13.06.2010 20:50

Цитата:

Сообщение от MrSTEP (Сообщение 346731)
нет смысла в извинениях, на этом форуме ты правишь бал :)

OFF! Увы - недолго: Паскаль уходит, а на прочих языках я не пишу. Когда-то (~107 лет назад) делал проги на Delphi, да с тех пор всё позабыл от неупотребления. А СИ не знаю и знать не хочу: активно не нравится.

MrSTEP 13.06.2010 21:36

На паскале наверняка будут учить еще не одно поколение программистов.. На мой, пока еще не искушенный ЯПами, взгляд, для обучения он проще..

Vladimir_S 14.06.2010 09:46

Кстати, подумал - возможно, более изящное решение можно сделать при помощи указателей и организации стека, но тут я тоже, увы, не весьма.

kuzlar 16.06.2010 20:49

А не подскажите как это все оформить в виде процедуры?

Kostya_N 30.12.2013 13:08

Помогите пожалуйста решить задачу с помощью...

Vladimir_S 30.12.2013 13:40

Цитата:

Сообщение от Kostya_N (Сообщение 986252)
Помогите пожалуйста решить задачу

Значит, так. Информирую: у нас НЕ ПРИНЯТО цепляться к чужим темам, поэтому Вам создана отдельная: http://www.tehnari.ru/f41/t93452/. А если будете продолжать подобную деятельность, последует наказание.


Часовой пояс GMT +4, время: 09:47.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.