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

Технический форум (http://www.tehnari.ru/)
-   Basic (http://www.tehnari.ru/f127/)
-   -   Заполнить матрицу (http://www.tehnari.ru/f127/t249590/)

iks2 26.10.2016 10:21

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

Вопрос
годится ли мой код, если бы 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


prima 26.10.2016 10:30

Не совсем понятны начальные условия.
Отсюда и непонятен вопрос
Цитата:

Сообщение от iks2 (Сообщение 2427494)
годится ли мой код, если бы n = 6?


iks2 26.10.2016 11:21

prima,
в моем вопросе предполагается, что матрица будет заполняться "змейкой". То есть "голова змейки" - это левый верхний элемент матрицы, а "конец хвоста" будет там, где будет.

Vladimir_S 26.10.2016 11:42

Вложений: 1
Не знаю, просто нарисовал свою Паскаль-программку. Не утверждаю, что оптимальная, и даже скорее наоборот, но зато работает при любой размерности матрицы.
Код:

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.


iks2 26.10.2016 11:50

Vladimir_S
Спасибо!
Маленький вопрос: обнуление матрицы в Паскале обязательно? В Бейсике - нет, там матрица при объявлении инициализируется нулями.

Vladimir_S 26.10.2016 12:40

Цитата:

Сообщение от iks2 (Сообщение 2427514)
Маленький вопрос: обнуление матрицы в Паскале обязательно?

Ответ: а пёс его знает! Вроде не обязательно, в Pascal ABC (коим я не пользуюсь) - точно не нужно, в Turbo (Free) вроде тоже по умолчанию переменные обнуляются, когда-то в лохматые годы на ANSI Pascal, если я правильно помню, не обнулялись, просто я "на всякий случай" это делаю. Руки не отвалятся, а за сверхоптимизациями не гоняюсь.

Vladimir_S 26.10.2016 16:57

Не удержался - всё-таки подредактировал программу. А то уж очень было топорно:
Код:

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.



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

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