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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2007, 13:24   #1
cL1zMa
Пользователь
 
Регистрация: 14.12.2006
Сообщений: 26
По умолчанию Заполнить матрицу по спирали (turbo pascal)

Прошу помощи. Буду очень благодарен.

Задание:
Спираль. Матрицу М (m строк, n столбцов) заполнить натуральными числами от 1 до mxn (x - умножить) по спирали, начинающейся в левом верхнем углу и закрученной по часовой стрелке.

Т.е. как я понимаю из задания, надо запросить у юзера m и n. И закрутить числа по спирали.

Помогите пожалуйста.
cL1zMa вне форума Ответить с цитированием
Старый 27.04.2007, 14:47   #2
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию

Уточни, это должно выглядеть так, или нет:
_1__2__3__4__5__6
12_11_10__9__8__7
13_14_15_16_17_18

Если да, то:

Код:
const
 m = 10;
 n = 10;

var
 b: boolean;
 i,j,y: integer;
 x: array[1..m,1..n] of integer;

begin
 for i:=1 to m do
 begin
  y:=i mod 2;
  case y of //влево или вправо заполнять?
   1: for j:=1 to n do x[i,j]:=(i-1)*m+j;
   else for j:=n downto 1 do x[i,j]:=(i-1)*m+(n-j+1);
  end;
 end;
 //А теперь выведем полученную матрицу
 for i:=1 to m do
 begin
  for j:=1 to n do Write(x[i,j]:4);
  Writeln;
 end;
 //Ждем, пока какой-нибудь добрый человек не нажал Enter :)
 Readln;
end.
Visita Interiorem Terrae Rectificando Operae Lapidem...
Сильванович Михаил вне форума Ответить с цитированием
Старый 27.04.2007, 14:53   #3
RSLoader
_________
Пользователь
 
Аватар для RSLoader
 
Регистрация: 27.03.2007
Сообщений: 69
По умолчанию

Скорее, думаю, что так:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Ведь змейка и спираль - вещи разные
Код:
var
  a:array[1..100,1..100]of integer;
  i,imax,imin,j,jmax,jmin,k,m,n:integer;
begin
  write('Vvedite 4islo strok: ');
  readln(m);
  write('Vvedite 4islo stolbcov: ');
  readln(n);
  jmin:=1;
  jmax:=n;
  imin:=2;
  imax:=m;
  k:=0;
  repeat
    for j:=jmin to jmax do
    begin
      inc(k);
      a[imin-1,j]:=k;
    end;
    for i:=imin to imax do
    begin
      inc(k);
      a[i,jmax]:=k;
    end;
    dec(jmax);
    for j:=jmax downto jmin do
    begin
      inc(k);
      a[imax,j]:=k;
    end;
    dec(imax);
    for i:=imax downto imin do
    begin
      inc(k);
      a[i,jmin]:=k;
    end;
    inc(imin);
    inc(jmin);
  until k>=m*n;
  for i:=1 to m do
  begin
    writeln;
    for j:=1 to n do write(a[i,j]:3);
  end;
  readln;
end.
RSLoader вне форума Ответить с цитированием
Старый 27.04.2007, 21:51   #4
cL1zMa
Пользователь
 
Регистрация: 14.12.2006
Сообщений: 26
По умолчанию

Спасибо огромное! Очень рад, что есть есть этот форум, и люди готовые помочь. Благодарю.

Последний раз редактировалось cL1zMa; 27.04.2007 в 21:56.
cL1zMa вне форума Ответить с цитированием
Старый 28.04.2007, 08:52   #5
cL1zMa
Пользователь
 
Регистрация: 14.12.2006
Сообщений: 26
По умолчанию

Уважаемые, помогите пожалуйста ещё составить к этой программе словесный алгоритм и частично формализованный вид этого словесного алгоритма.

Например
1. Запросить число m
2. Запросить число n
...
15. Вывести на экран

Сам составить не могу, т.к. не до конца понимаю код программы. Спасибо.
cL1zMa вне форума Ответить с цитированием
Старый 04.05.2010, 17:51   #6
nbalex24
Новичок
Джуниор
 
Регистрация: 16.03.2010
Сообщений: 2
По умолчанию

помогите изменить программу (сейчас она заполняет матрицу с нижнего правого угла, а мне надо с верхнего левого)

program pr1;
uses crt;
var a: array [1..5,1..5] of byte;
i,j,k,v,b,c,d: byte;
begin
clrscr;
i:=5; j:=1; v:=1; b:=0; c:=0; d:=2;
a[i,j]:=1; k:=2;
repeat
while i>v do
begin
dec(i); a[i,j]:=k; inc(k);
end;
inc(v);
while j<5-b do
begin
inc(j); a[i,j]:=k; inc(k);
end;
inc(b);
while i<5-c do
begin
inc(i); a[i,j]:=k; inc(k);
end;
inc(c);
while j>d do
begin
dec(j); a[i,j]:=k; inc(k);
end;
inc(d);
until k>25;
for i:=1 to 5 do
begin
writeln;
for j:=1 to 5 do
begin
if a[i,j]<=25 then
write (a[i,j]:2, ' ');
if a[i,j]>=5 then
if a[i,j]=25 then
end;
end;
readln
end.
nbalex24 вне форума Ответить с цитированием
Старый 04.05.2010, 19:43   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) используйте тег [СODE] (кнопка с решёточкой # )
2) а чем не подходит программка из #3 (c) RSLoader
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.05.2010, 09:23   #8
nbalex24
Новичок
Джуниор
 
Регистрация: 16.03.2010
Сообщений: 2
По умолчанию

не подходит мне нужна вот этим способом)))
да и я с началом ошибся мне из верхнего правого вниз надо.......
nbalex24 вне форума Ответить с цитированием
Старый 16.05.2020, 12:00   #9
canadamoscow
Пользователь
 
Аватар для canadamoscow
 
Регистрация: 16.05.2020
Сообщений: 57
По умолчанию

Матрица по спирали из любого угла или из центра, по часовой или против часовой на Turbo Pascal
Код:
const
  n = 5; // размер матрицы от n = 2 (2 на 2) и более
  izCentra = 0; // 0 - из угла  1 - из Centerа
var
  Center, i, j, Napravlenie, nChetnoe, Element: integer;
  matrix: array [1..n, 1..n] of integer;
begin
  Center := n div 2; if odd(n) then inc(Center);  //Координата центра матрицы  
  i := Center; j := Center; Napravlenie := 1; nChetnoe := 0;
  if izCentra = 0 then begin  i := 1; j := 1; if not odd(n) then nChetnoe := 1; end;
  for Element := 1 to n*n do
   begin
      matrix[i, j] := Element; {
[i,j] - с левого верхнего по часовой;  из Centerа вправо по часовой
[j,i] - с левого верхнего против часовой;  из Centerа вниз против часовой
[n+1-i,j] - с левого нижнего против часовой;  из Centerа вправо против часовой
[n+1-j,i] - с левого нижнего по часовой;  из центра вверх по часовой
[j,n+1-i] - с правго верхнего по часовой;  из Centerа вниз по часовой часовой
[i,n+1-j] - c правго верхнего против часовой;  из Centerа влево против часовой
[n+1-i,n+1-j] - c правого нижнего по часовой;  из Centerа влево по часовой
[n+1-j,n+1-i] - c правого нижнего против часовой;  из центра вверх по часовой
}
       case Napravlenie of 
         1:begin {вправо}              
           inc(j);           
           if (Center - i + izCentra ) = (j - Center - nChetnoe)  then Napravlenie := 2;           
           end;
         2:begin {вниз}               
           inc(i);           
           if i = j  then Napravlenie := 3;
           end;
         3:begin {влево}
           dec(j);
           if (i - Center) = (Center - j  + nChetnoe) then Napravlenie := 4;
           end;
         4:begin {вверх}
           dec(i);
           if (i - 1) = (j - izCentra)   then Napravlenie := 1;
           end
       end;
    end;
  for i := 1 to n do
    begin
      for j := 1 to n do write(matrix[i,j]:2, ' ');
      writeln;
    end;
end.

Последний раз редактировалось canadamoscow; 16.05.2020 в 12:17.
canadamoscow вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка матрицы по спирали {pascal} Влдислаав3911 Помощь студентам 3 10.04.2012 22:05
Массив (Turbo Pascal) Wizzard Помощь студентам 2 20.01.2008 09:59