• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Двумерные массивы и процедуры PASCAL

  • Автор темы Автор темы kuzlar
  • Дата начала Дата начала

kuzlar

Ученик
Регистрация
13 Июн 2010
Сообщения
2
Реакции
0
Баллы
0
Двумерные массивы и процедуры PASCAL

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

Во-вторых, где ваши наработки (наброски)? Выкладывайте, мы поможем, исправим
 
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, я смиренно прошу извинения, что встреваю
нет смысла в извинениях, на этом форуме ты правишь бал :)

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