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

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

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

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

Заполнить матрицу

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

iks2

Новые
Регистрация
22 Окт 2016
Сообщения
62
Реакции
0
Баллы
0
Заполнить матрицу

Требуется заполнить матрицу как на рисунке.
Вероятно это можно сделать и проще, но я сделал так.

Вопрос
годится ли мой код, если бы n = 6?

Код:
CLS
CONST n = 7
DIM A(1 TO n, 1 TO n)

k = 1

FOR i = 1 TO n
FOR j = 1 TO n
   IF i <= n \ 2 + 1 AND i <= j AND i + j <= 8 THEN
      A(i, j) = k
      k = k + 1
   ELSEIF i >= j AND i + j >= 8 THEN
      A(i, j) = k
      k = k + 1
   END IF
NEXT j, i

FOR i = 2 TO n STEP 2
FOR j = 1 TO n \ 2
   SWAP A(i, j), A(i, n + 1 - j)
NEXT j, i

FOR i = 1 TO n
FOR j = 1 TO n
   PRINT USING "  ###"; A(i, j);
NEXT j: PRINT
NEXT i
END
 

Вложения

  • 506.gif
    506.gif
    13.9 KB · Просмотры: 97
prima,
в моем вопросе предполагается, что матрица будет заполняться "змейкой". То есть "голова змейки" - это левый верхний элемент матрицы, а "конец хвоста" будет там, где будет.
 
Не знаю, просто нарисовал свою Паскаль-программку. Не утверждаю, что оптимальная, и даже скорее наоборот, но зато работает при любой размерности матрицы.
Код:
Const
 Nmax=12;
Var
 N,i,j,j1,j2,k:Byte;
 sj:ShortInt;
 A:Array[1..Nmax,1..Nmax] of Byte;

Begin
 Write('N (<',Nmax+1,') = ');
 Readln(N);
 Writeln;
 k:=0;
 sj:=1;
 for i:=1 to N do
  for j:=1 to N do
   A[i,j]:=0;
 i:=1;
 Repeat
  j1:=i;
  j2:=N-i+1;
  if sj=1 then
   for j:=j1 to j2 do
    begin
     k:=k+1;
     A[i,j]:=k;
    end
  else
   for j:=j2 downto j1 do
    begin
     k:=k+1;
     A[i,j]:=k;
    end;
  sj:=-sj;
  i:=i+1;
 Until i>N-i+1;
 Repeat
  j1:=N-i+1;
  j2:=i;
  if sj=1 then
   for j:=j1 to j2 do
    begin
     k:=k+1;
     A[i,j]:=k;
    end
  else
   for j:=j2 downto j1 do
    begin
     k:=k+1;
     A[i,j]:=k;
    end;
  sj:=-sj;
  i:=i+1;
 Until i=N+1;
 for i:=1 to N do
  begin
   for j:=1 to N do Write(A[i,j]:5);
   writeln;
  end;
 Readln
End.
 

Вложения

  • AA01.webp
    AA01.webp
    11.9 KB · Просмотры: 66
Vladimir_S
Спасибо!
Маленький вопрос: обнуление матрицы в Паскале обязательно? В Бейсике - нет, там матрица при объявлении инициализируется нулями.
 
Маленький вопрос: обнуление матрицы в Паскале обязательно?
Ответ: а пёс его знает! Вроде не обязательно, в Pascal ABC (коим я не пользуюсь) - точно не нужно, в Turbo (Free) вроде тоже по умолчанию переменные обнуляются, когда-то в лохматые годы на ANSI Pascal, если я правильно помню, не обнулялись, просто я "на всякий случай" это делаю. Руки не отвалятся, а за сверхоптимизациями не гоняюсь.
 
Не удержался - всё-таки подредактировал программу. А то уж очень было топорно:
Код:
Const
 Nmax=12;
Var
 N,i,j,j1,j2,k:Byte;
 sj:ShortInt;
 A:Array[1..Nmax,1..Nmax] of Byte;

Begin
 Write('N (<',Nmax+1,') = ');
 Readln(N);
 Writeln;
 k:=0;
 sj:=1;
 for i:=1 to N do
  for j:=1 to N do
   A[i,j]:=0;
 i:=1;
 Repeat
  if i<=(N div 2) then
   begin
    j1:=i;
    j2:=N-i+1;
   end
  else
   begin
    j2:=i;
    j1:=N-i+1;
   end;
  if sj=1 then
   for j:=j1 to j2 do
    begin
     k:=k+1;
     A[i,j]:=k;
    end
  else
   for j:=j2 downto j1 do
    begin
     k:=k+1;
     A[i,j]:=k;
    end;
  sj:=-sj;
  i:=i+1;
 Until i=N+1;
 for i:=1 to N do
  begin
   for j:=1 to N do Write(A[i,j]:5);
   writeln;
  end;
 Readln
End.
 
Назад
Сверху