Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/704: Рейтинг темы: голосов - 704, средняя оценка - 4.62
STGE
771 / 576 / 324
Регистрация: 17.06.2009
Сообщений: 1,187
1

Описание, объявление и заполнение массивов (матриц)

21.05.2010, 13:13. Просмотров 140560. Ответов 17
Метки нет (Все метки)

Приветствую всех посетителей данной темы. Очень часто наблюдаю, что многие новички создавая очередную тему по массивам даже понятия не имеют каким образом его можно описать, заполнить и какие виды работы с его элементами существуют.

Итак, начнём с видов описания одномерного массива (при описании массивов будет использоваться базовый тип integer (-32768..+32767)):

1) описание в разделе констант:
Pascal
1
const a: array[1..10] of integer=(31,546,61,9876,-35,654,1,0,90,-429);
2) описание в разделе var (раздел описания переменных):
Pascal
1
var a: array[1..10] of integer;
3) описание типа массив в разделе описания типов или type:
Pascal
1
type a=array[1..10] of integer;
Заполнение массивов:

1) заполнение одномерного массива посредством генератора случайных чисел, состоящего из 10-ти элементов и описанного в разделе описаний переменных:

Pascal
1
2
3
4
5
6
7
8
9
var a: array[1..10] of integer; i: byte;
begin
randomize   {процедура, которая служит для инициализации (или как ещё называют раскачки) генератора случайных чисел}
for i:=1 to 10 do
begin
a[i]:=random(19);   {функция, генерирующая случайное число от нуля до 18:  random(n+1)} 
write(a[i],'     ');
end;
end.
2) прямое заполнение массива через ввод с клавиатуры с помощью команд read/readln (на этот раз опишем тип массив и переменную данного типа):

Pascal
1
2
3
4
5
6
7
8
9
type a=array[1..10] of integer; 
var b: a; i: byte;  {переменная i выполняет роль счётчика цикла с параметром, т.е. for}
begin
writeln('введите значения элементов одномерного массива: ');
for i:=1 to 10 do begin
  write('a[',i,'] = ');
  readln(a[i]);   {вот здесь, собственно, и осуществляется ввод очередного значения элемента массива}
end;
end.
3) метод присваивания элементам массива определённых значений с помощью оператора присваивания ":=":

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var a: array[1..10] of integer; i: byte;
begin
a[1]:=25;
a[2]:=-65;
a[3]:=0;
a[4]:=12;
a[5]:=-968;
a[6]:=-459;
a[7]:=-21;
a[8]:=54;
a[9]:=901;
a[10]:=2890;
for i:=1 to 10 do   {вывод значений элементов массива на экран}
write(a[i],'    ');    
end.
4) заполнение массива по определённому закону, т.е. с помощью формул:
допустим что очередной элемент массива будет равен разности квадратов двух предыдущих элементов, т.е. a[i]=sqr(a[i-1])-sqr(a[i-2]):

Pascal
1
2
3
4
5
6
7
8
9
10
11
var a: array[1..10] of integer; i: byte;
begin
a[1]:=2;    {т.к. у нас формула a[i]=sqr(a[i-1]) - sqr(s[i-2]), то понятно, что 1-й и 2-й элементы не будут иметь двух предыдущих элементов, и поэтому мы их заполним с помощью оператора присваивания}
a[2]:=3;
write(a[1],'   ',a[2],'   ');
for i:=3 to 10 do
begin
a[i]:=sqr(a[i-1]) - sqr(a[i-2]);
write(a[i],'   ');
end;
end.
Существуют ещё несколько способов заполнения массивов, но об этом потом.
Надеюсь моя тема, оказалась полезной и информативной для непросвещённых.

Добавлено через 11 часов 25 минут
5) импорт данных (двоичный типизированный/нетипизированный, текстовый):
для начала рассмотрим двоичный типизированный файл:
т.к. мы считываем инф. из файла, то необходимо его заполнить с помощью следующей программы:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var a: file of integer; i,k: integer;
begin
assign(a,'file.bin');   {установка связи файловой переменной типа integer с двоичным типизированным файлом (содержит элементы типа integer, поэтому типизированный, т.е. тип данных уже определён)}
rewrite(a);  {открываем файл посредством файловой переменной для записи}
for i:=-4 to 5 do   {записывать будем абсолютные значения от -4 до -1 и квадраты значений от 0 до 5}  
begin
if i<0 then k:=abs(i)
else k:=sqr(i);
write(a,k);
end;
close(a);   {обязательно закрываем этот файл после работы с ним}
end.
А вот и программа считывающая данные из файла в ячейки массива:

Pascal
1
2
3
4
5
6
7
8
9
10
11
var a: file of integer; i: byte; mas: array[1..10] of integer;
begin
assign(a,'file.bin');
reset(a);   {открываем файл для чтения}
for i:=1 to n do   {считываем очередное значение в ячейку массива и выводим его на экран}
begin
read(a,mas[i]);
write(mas[i],'   ');
end;
close(a);
end.
47
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2010, 13:13
Ответы с готовыми решениями:

Обработка и описание массивов
Помогите пожалуйста: 1)Сформировать и вывести матрицу А(10,10),элементы которой заданы...

Заполнение матриц случайными числами
Помогите с заданием, пожалуйста: В процедуре заполните матрицу пятого порядка случайными числами....

Обработка двумерных массивов (матриц)
Вычислите сумму и число элементов матрицы, находящихся под главной диагональю и над ней.

Обработка двумерных массивов(матриц)
Дана матрица А(M,N) 1)Составить вектор из номеров столбцов матрицы, где есть хотя бы одно число...

Объявление массивов в коде
Ну и еще один вопрос,это объявление массивов внутри кода. Я имею в виду не просто var a:array of...

17
STGE
771 / 576 / 324
Регистрация: 17.06.2009
Сообщений: 1,187
26.05.2010, 13:29  [ТС] 2
работа с нетипизированным двоичным файлом:
аналогично двум предыдущим примерам заполним файл произвольными значениями, а затем извлечём их в ячейки массива:

заполнение:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var a: file; i,k: integer;
begin
assign(a,'file.bin');   {установка связи файловой переменной типа integer с двоичным нетипизированным файлом (содержит элементы типа integer (но может содержать и значения других типов данных, поэтому нетипизированный), т.е. тип данных определяется в зависимости от значения)}
rewrite(a,1);  {открываем файл посредством файловой переменной для записи; 1 - размер единицы инф. для обмена данными}
for i:=-4 to 5 do   {записывать будем абсолютные значения от -4 до -1 и квадраты значений от 0 до 5}  
begin
if i<0 then k:=abs(i)
else k:=sqr(i);
blockwrite(a,k,sizeof(k));  {команда определения величины записываемой инф. в данном случае переменной k}
end;
close(a);   {обязательно закрываем этот файл после работы с ним}
end.
импорт из файла:

Pascal
1
2
3
4
5
6
7
8
9
10
11
var a: file; i: byte; mas: array[1..10] of integer;
begin
assign(a,'file.bin');
reset(a,1);   {открываем файл для чтения}
for i:=1 to n do   {считываем очередное значение в ячейку массива и выводим его на экран}
begin
blockread(a,mas[i],sizeof(mas[i]));
write(mas[i],'   ');
end;
close(a);
end.
13
STGE
771 / 576 / 324
Регистрация: 17.06.2009
Сообщений: 1,187
28.05.2010, 02:11  [ТС] 3
Итак, перейдём к многомерным массивам:
Начнём с того, что такое многомерный массив - это упорядоченная совокупность однотипных данных, характеризуемая более чем одним параметром (индексирование массива по нескольким параметрам).
Пример: предположим точка на координатной плоскости отличается от остальных точек, своими координатами по оси x и y (углубляться в более подробное описание координатных плоскостей мы не будем, ибо это является одной из задач математики) и значением (предположим в роли значения в данном случае будет выступать расстояние от начала координат до заданной точки; оно определяется по ф-ле: L=sqrt(sqr(x2-x1)+sqr(y2-y1))):
Pascal
1
mas[x,y]=sqrt(sqr(x)+sqr(y));
( в данном примере мы опустили значение "0", т.к. sqrt(sqr(x-0)+sqr(y-0))= sqrt(sqr(x)+sqr(y)); нуль используется потому, что расстояние находится от начала координат, а параметры начала координат = 0;0). С точки зрения математики
в программировании данный пример не очень корректен, т.к. координата точки - это тоже, в свою очередь определённое значение и оно может быть любым (т.е. и вещественным в том числе, а индекс массива - это обязательно целое число);

Но мы всё же немного опередили события, и мне хотелось бы начать с описания многомерных массивов:

1) раздел описаний (var - сокращ. от англ. variables - изменчивый, меняющийся, переменный):

Pascal
1
var a: array[1..10,0..5,7..15] of integer;
Если не понятно, то будем разбираться. Мы задали многомерный (в данном сл. трёхмерный) массив (двух, трёх , четырёх и т.д. -мерные массивы - это описание размерности массива; в последствии именно это определение будет применяться при работе с массивами, поэтому не упустите этот момент), диапазон индексов которого: 1..10, 0..5, 7..15 (например: товары, поступающие в магазин имеют последовательный идентификационный код из трёх цифр (три индекса, т.к. массив трёхмерный), а цена товара - это значение элемента массива: 1 - й товар, а т.е. mas[1,0,7] = 35; 2-й - mas[2,0,7] = 64; ...последний - mas[10,5,15] = 35);

2) описание одномерного массива в разделе var, имеющего тип одномерный массив:

Pascal
1
2
type a = array[1..10] of integer;
var mas: array[1..10] of a;
Данный фрагмент является описанием одномерного массива, имеющего тип одномерный массив и в итоге, можно сказать, что каждая ячейка одномерного массива является одномерным массивом, а в общем данную конструкцию можно назвать двумерным массивом и при обращении к элементу массива мы будем указывать два индекса: mas[i,j]:=…;

3) описание двумерного массива в разделе const (константы):

Pascal
1
const mas: array[1..3,1..5] of  integer=((3,-2,1,4,3),(-5,-9,0,3,7),(-1,2,1,-4,0));
Здесь суть в том, что каждая из трёх так называемых позиций содержит ещё пять (три строки, два столбца, если в виде таблицы).
При выводе такого массива на экран мы получим (с использованием двух циклов и операторов write/writeln):

3 -2 1 4 3
-5 -9 0 3 7
-1 2 1 -4 0

вот исходный код :

Pascal
1
2
3
4
5
6
7
8
9
10
11
const mas: array[1..3,1..5] of  integer=((3,-2,1,4,3),(-5,-9,0,3,7),(-1,2,1,-4,0)); 
var i,j: byte;
begin
writeln('исходный массив: ');
for i:=1 to 3 do   {перебор строк с 1-й по 3-ю}
begin
for j:=1 to 5 do   {перебор столбцов с 1-ого по 5-й}
write(mas[i,j]:4);   {вывод элемента строки и столбца определённых индексов  ":4" - оформление форматного вывода на экран, т.е. с заданным отступом}
writeln;   {очевидно, что если мы хотим получить форму в виде таблицы, необходимо делать построчный переход вниз}
end;
end.


( основные методы заполнения многомерного массива аналогичны одномерному, поэтому в данной теме рассмотрены не будут)

Добавлено через 13 минут
Единственное отличие состоит в том, что заполнение элементов проводится, с учётом полной индексации, т.е. с учётом размерности массива: если массив двухмерный, то mas[i,j]:=...; если трёхмерный, то mas[i,j,k]:=... и т.д. (ну и само собой используется соответствующее кол-во циклов по всем параметрам размерности)
12
Unrealler
654 / 352 / 113
Регистрация: 11.12.2009
Сообщений: 508
31.05.2010, 09:38 4
Раз уж перешли к двумерным массивам, то выкладываю примеры различных вариантов заполнений.
1) Заполнение "змейкой"
Например:
Код
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
На самом деле вовсе не нужно колбасить два варианта цикла по столбцам (в зависимости от четности строки). Все гораздо проще:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
   a:array[1..100,1..100] of integer;
   i,j,n,m:integer;
begin
 read(n,m); {êîëè÷åñòâî ñòðîê è ñòîëáöîâ}
 for i:=1 to n do
  for j:=1 to m do
   if (i mod 2=1) then a[i,j]:=(i-1)*m+j else a[i,j]:=i*m-j+1; {çàïîëíåíèå}
 for i:=1 to n do
  begin
   for j:=1 to m do
    write(a[i,j]:4);  {âûâîä íà ýêðàí}
   writeln;
  end;
 readln
end.
2) Треугольник Паскаля
Например:
Код
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
Нетрудно заметить, что каждый элемент (кроме первого столбца и первой строки) равен сумме элементов, стоящих слева и над ним. Реализация:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
   a:array[1..100,1..100] of integer;
   i,j,n,m:integer;
begin
 read(n,m); {êîëè÷åñòâî ñòðîê è ñòîëáöîâ}
 for i:=1 to n do
  for j:=1 to m do
   if (i=1) or (j=1) then a[i,j]:=1 else a[i,j]:=a[i-1,j]+a[i,j-1]; {çàïîëíåíèå}
 for i:=1 to n do
  begin
   for j:=1 to m do
    write(a[i,j]:4);  {âûâîä íà ýêðàí}
   writeln;
  end;
 readln
end.
Теперь перейдем к более необычным вариантам заполнения.
3) Заполнение спиралью из центра
Пусть у нас есть число n. Создадим матрицу порядка 2*n+1 и заполним его по примеру (n=2):
Код
12 11 10  9 24
13  2  1  8 23
14  3  0  7 22
15  4  5  6 21
16 17 18 19 20
"Старт" находится в точке с координатами (n+1,n+1)
Реализация:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
var a:array [1..100,1..100] of integer;
    i,j,s,x,y,n:integer;
    napr,shag:byte;
begin
 readln(n); {ñ÷èòûâàåì n}
 x:=n+1;  {êîîðäèíàòû òåêóùåé êëåòêè}
 y:=n+1;
 shag:=1; {êîëè÷åñòâî ýëåìåíòîâ â âèòêå ñïèðàëè}
 napr:=1; {íàïðàâëåíèå äâèæåíèÿ}
 s:=-1;   {ñ÷åò÷èê, óâåëè÷èâàåìûé íà 1}
 repeat
  begin
   for j:=1 to 2 do {íåòðóäíî çàìåòèòü, ÷òî êàæäûå äâà âèòêà îäèíàêîâû ïî äëèíå(ñì. ïðèìåð)}
    begin
     for i:=1 to shag do {ïîýòîìó ìû ìîæåì çàïîëíÿòü ïî äâà âèòêà ñ îäíèì øàãîì}
      begin
       inc(s);
       a[x,y]:=s; {çàïîëíÿåì òåêóùèé ýëåìåíò}
       if (napr=1) then dec(x);
       if (napr=2) then dec(y); {âûáîð íàïðàâëåíèÿ äâèæåíèÿ}
       if (napr=3) then inc(x);
       if (napr=4) then inc(y);
      end;
     inc(napr);                {èçìåíÿåì íàïðâëåíèå}
     if (napr=5) then napr:=1;
    end;
   inc(shag); {äâà âèòêà ïðîéäåíû, ïîýòîìó óâåëè÷èâàåì ðàçìåð øàãà}
  end;
 until (shag=2*n+1); {åäèíñòâåííûé ìèíóñ - ïîñëåäíèé ñòîëáåö îñòàåòñÿ íåçàïîëíåííûì, ïîýòîìó}
 for i:=2*n+1 downto 1 do {çàïîëíÿåì åãî}
  begin
   inc(s);
   a[i,2*n+1]:=s;
  end;
 for i:=1 to 2*n+1 do
  begin
   for j:=1 to 2*n+1 do
    write(a[i,j]:4);  {âûâîäèì ìàññèâ}
   writeln;
  end;
 readln
end.
4) Заполнение двумерного массива одним циклом
Пусть нам надо заполнить матрицу как таблицу умножения, т.е. каждый элемент равен произведению его индексов (a[i,j]=i*j)
Например:
Код
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
В принципе, неважно, как заполнять массив, главное, чтобы заполнить его одним циклом:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
   n,m,i,j:integer;
   a:array[1..100,1..100] of integer;
begin
 read(n,m);
 i:=1;  {счетчик строк}
 j:=1;  {счетчик столбцов}
 while (i<=n) and (j<=m) do
  begin
   a[i,j]:=i*j;
   inc(j);  {óâåëè÷èâàåì ñ÷åò÷èê ñòîëáöîâ}
   if (j=m+1) then {åñëè òåêóùèé ñòîëáåö âûøåë çà ïðåäåëû ìàññèâà, òî}
    begin
     j:=1;  {äåëàåì òåêóùèì ïåðâûé ñòîëáåö}
     inc(i); {óâåëè÷èâàåì ñ÷åò÷èê ñòðîêè}
    end;
  end;
 for i:=1 to n do
 begin
  for j:=1 to m do
   write(a[i,j]:4); {âûâîäèì ìàññèâ óæå ïî-îáû÷íîìó}
  writeln;
 end;
 readln
end.
16
31.05.2010, 09:38
Unrealler
654 / 352 / 113
Регистрация: 11.12.2009
Сообщений: 508
02.06.2010, 13:10 5
5) Построение магического квадрата нечетного порядка
Магический квадрат-таблица, заполненная числами от 1 до http://www.cyberforum.ru/cgi-bin/latex.cgi?{n}^{2} таким образом, что сумма чисел во всех строках, столбцах и диагоналях одинакова. Более подробно можно посмотреть тут: http://ru.wikipedia.org/wiki/%D0%9C%...80%D0%B0%D1%82
Почему только нечетного порядка? Во-первых, потому что способы построений различны в зависимости от n. А во-вторых, потому что это самый простой вариант, и его чаще всего просят сделать
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
   n,v,x,y,i,j:integer;
   a:array[0..15,0..15] of integer;
begin
 readln(n);  {ïîðÿäîê ìàòðèöû, n äîëæíî áûòü íå÷åòíûì}
 v:=n div 2;
 for i:=0 to n-1 do
  for j:=0 to n-1 do
   begin
    x:=i+j-v;
    y:=i-j+v;
    if (x<0) then inc(x,n) else
    if (x>=n) then dec(x,n);
    if (y<0) then inc(y,n) else
    if (y>=n) then dec(y,n);
    a[y,x]:=i*n+j+1;
   end;
 for y:=0 to n-1 do
  begin
    for x:=0 to n-1 do
      write(a[y,x]:4);
    writeln;
  end;
 readln
end.
9
Puporev
02.06.2010, 13:35
  #6

Не по теме:

Unrealler, Не ищи легких путей, напиши для четных, нечетный на форуме уже был.

1
Unrealler
654 / 352 / 113
Регистрация: 11.12.2009
Сообщений: 508
02.06.2010, 14:10 7
6) Построение магического квадрата при (n mod 4=0)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
var
   i,j,k,p,l,i1,j1,x,y,n:integer;
   a:array[1..100,1..100] of integer;
begin
 readln(n);
 l:=1;
 p:=n*n;
 for i:=1 to n do
  for j:=1 to n do
   begin
    a[i,j]:=l;
    inc(l)
   end;
 i:=2;
 while (i<=n-2) do
  begin
   if (i mod 4=0) then j:=4 else j:=2;
   while (j<=n-2) do
    begin
     for i1:=0 to 1 do
      for j1:=0 to 1 do
       begin
        y:=i+i1;
        x:=j+j1;
        a[y,x]:=p-a[y,x]+1;
       end;
     j:=j+4;
    end;
   i:=i+2
  end;
 k:=4;
 while (k<=n-4) do
  begin
   a[1,k]:=p-a[1,k]+1;
   a[1,k+1]:=p-a[1,k+1]+1;
   a[n,k]:=p-a[n,k]+1;
   a[n,k+1]:=p-a[n,k+1]+1;
   a[k,1]:=p-a[k,1]+1;
   a[k+1,1]:=p-a[k+1,1]+1;
   a[k,n]:=p-a[k,n]+1;
   a[k+1,n]:=p-a[k+1,n]+1;
   inc(k,4);
  end;
 a[1,1]:=p-a[1,1]+1;
 a[n,n]:=p-a[n,n]+1;
 a[1,n]:=p-a[1,n]+1;
 a[n,1]:=p-a[n,1]+1;
 for i:=1 to n do
  begin
   for j:=1 to n do
    write(a[i,j]:4);
   writeln;
  end;
 readln
end.
9
Unrealler
654 / 352 / 113
Регистрация: 11.12.2009
Сообщений: 508
04.06.2010, 09:24 8
7) Заполнение матрицы по периметру по часовой стрелке
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
var
   a:array[1..15,1..15] of integer;
   i,j,m,n,s:integer;
   x,y:integer; {êîîðäòíàòû òåêóùåé ÿ÷åéêè}
   napr,shag:byte; {íàïðàâëåíèå äâèæåíèÿ è ðàçìåð øàãà ñîîòâåòñòâåííî}
begin
 write('Ââåäèòå êîëè÷åñòâî ñòðîê=');
 readln(n);
 write('Ââåäèòå êîëè÷åñòâî ñòîëáöîâ=');
 readln(m);
 randomize;
 writeln('Ìàòðèöà');
 for i:=1 to n do
  begin
   for j:=1 to m do
    begin
     a[i,j]:=random(51);      {çàïîëíåíèå ìàòðèöû ñëó÷àéíûìè ÷èñëàìè è âûâîä åå íà ýêðàí}
     write(a[i,j]:4);
    end;
   writeln;
  end;
 x:=0;
 y:=1;
 s:=0;
 napr:=1;
 shag:=n;
 writeln('Ïîñëå çàïîëíåíèÿ');
 repeat
  begin
   for i:=1 to shag do
    begin
     case napr of
     1: inc(x);     {äâèæåìñÿ âíèç}
     2: inc(y);     {âïðàâî}
     3: dec(x);     {ââåðõ}
     4: dec(y);     {âëåâî}
     end;
     inc(s);    {óâåëè÷èâàåì ñ÷åò÷èê}
     a[x,y]:=s;    {çàïîëíÿåì òåêóùèé ýëåìåíò}
    end;
   inc(napr);  {ìåíÿåì íàïðàâëåíèå}
   if (napr mod 2=0) then shag:=m-1 else shag:=n-1; {åñëè napr ÷åòíîå, òî äâèæåìñÿ ïî êîë-âó ñòîëáöîâ, à åñëè íåò, òî ïî êîë-âó ñòðîê}
  end;
 until (napr=5); {äî òåõ ïîð, ïîêà íå ïðîéäåì âî âñåõ íàïðàâëåíèÿõ}
 a[1,1]:=1; {ïåðâàÿ êëåòêà îêàæåòñÿ çàïîëíåííîé, ïîýòîìó âîçâðàùàåì åé 1}
 for i:=1 to n do
  begin
   for j:=1 to m do
    write(a[i,j]:4);    {âûâîä ìàòðèöû}
   writeln;
  end;
 readln
end.
7
InferI
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 3
07.06.2010, 12:05 9
А если необходимо заполнить массив по определенной траектории? Скажем, мне нужно в порядке убывания разместить элементы в направлении, указанном на рисунке:
Название: Безымянный.JPG
Просмотров: 32798

Размер: 8.7 Кб

код что-то не выходит: до центра дохожу и стопорится, да к тому же зацикливается. Подскажите, как такой вариант решается?

PS пардон, возможна эта тема закрыта, но если именно здесь будет опубликован ответ, то, возможно, в дальнейшем не возникнет подобных вопросов (к тому же вопрос вполне по теме).
1
Unrealler
654 / 352 / 113
Регистрация: 11.12.2009
Сообщений: 508
08.06.2010, 14:26 10
8) Заполнение "треугольниками"
Пример:
Код
1 1 1 1 1 1 1 
0 1 1 1 1 1 0 
0 0 1 1 1 0 0 
0 0 0 1 0 0 0 
0 0 1 1 1 0 0 
0 1 1 1 1 1 0 
1 1 1 1 1 1 1
Реализация:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
   a:array[1..100,1..100] of integer;
   i,j,n:integer;
begin
 write('Ââåäèòå ïîðÿäîê ìàòðèöû=');
 readln(n);
 for i:=1 to n do
  begin
   for j:=1 to n do
    begin
     if (i<=j) and (i+j<=n+1) or (i>=j) and (i+j>=n+1) then a[i,j]:=1; {çàïîëíåíèå åäèíèöàìè, ïðåäïîëàãàåòñÿ, ÷òî ìàññèâ îáíóëåí}
     write(a[i,j],' ');
    end;
   writeln;
  end;
 readln
end.

Не по теме:

InferI, тут нужно подумать. Возможно чуть позже, если сделаю, выложу

10
vip_romik
0 / 0 / 0
Регистрация: 05.04.2011
Сообщений: 3
05.04.2011, 23:45 11
А если по часовой стрелки с нижнего угла?

0
Puporev
Модератор
57812 / 44044 / 30414
Регистрация: 18.05.2008
Сообщений: 105,323
06.04.2011, 09:29 12
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
uses crt;
var a:array[1..20,1..20]of integer;
    n,i,j:integer;
    x,y,number,add,direction:integer;
begin
clrscr;
write('n=');readln(n);
x:=n+1;
y:=n;
number:=1;
Add:=n;
direction:=-1;
while (add<>0) do
begin
  i:=0;
  while (i<>Add) do
    begin
    x:=x+direction;
    a[y,x]:=number;
    number:=number+1;
    i:=i+1;
    end;
  i:=0;
  Add:=Add-1;
  while (i<>Add) do
    begin
    y:=y+direction;
    a[y,x]:=number;
    number:=number+1;
    i:=i+1;
    end;
  direction:=direction*(-1);
end;
for i:=1 to n do
   begin
     for j:=1 to n do
     write(a[i,j]:4);
     writeln;
   end;
readln
end.
Меняя координаты начального пункта и порядок движения можно получить этим методом любую спираль, в том числе и обратную, от центра.
3
molka
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 11
03.05.2011, 23:56 13
вот у меня вопрос по теории :
В каких случаях целесообразно описывать двумерный массив с помощью одномерных?
0
Puporev
Модератор
57812 / 44044 / 30414
Регистрация: 18.05.2008
Сообщений: 105,323
04.05.2011, 06:16 14
В случаях когда нужно производить действия в строках или столбцах, или при их перестановках в матрице.
Например обмен строк 1 - n,2 - n-1,3 - n-2....

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
const n=6;
type Tmas=array [1..n] of integer;
     Tmatr=array [1..n] of Tmas;
var a:matr;
     x:mas;
begin
..............................
for i:=1 to n div 2 do
 begin
   x:=a[i];
   a[i]:=a[n-i+1];
   a[n-i+1]:=x;
  end;
Пишется как работа с линейным массивом.
1
.: TAPAKAH :.
Мега Таракан
110 / 11 / 5
Регистрация: 24.05.2010
Сообщений: 227
25.05.2011, 00:06 15
Извиняюсь за туповатый вопрос, но как заменить в массиве четверти? т.е. был массив такой
Код
1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0 
1 1 1 1 0 0 0 0 
1 1 1 1 0 0 0 0 
0 0 0 0 2 2 2 2 
0 0 0 0 2 2 2 2 
0 0 0 0 2 2 2 2 
0 0 0 0 2 2 2 2
а нужно преобразовать в такой
Код
2 2 2 2 0 0 0 0
2 2 2 2 0 0 0 0 
2 2 2 2 0 0 0 0 
2 2 2 2 0 0 0 0 
0 0 0 0 1 1 1 1 
0 0 0 0 1 1 1 1 
0 0 0 0 1 1 1 1 
0 0 0 0 1 1 1 1
как тогда быть?
З.Ы. Думаю этот вопрос не только мне будет интересен
0
STGE
771 / 576 / 324
Регистрация: 17.06.2009
Сообщений: 1,187
25.05.2011, 02:12  [ТС] 16
Цитата Сообщение от Kaka' Посмотреть сообщение
Извиняюсь за туповатый вопрос, но как заменить в массиве четверти?
Pascal
1
2
3
4
5
6
7
8
9
...
for i:=1 to n do
 for j:=1 to n do
  begin
   k:=mas[i,j];
   mas[i,j]:=mas[n-j+1,n-i+1];
   mas[n-j+1,n-i+1]:=k;
 end;
...
2
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5169 / 3052 / 2300
Регистрация: 22.11.2013
Сообщений: 8,542
19.10.2016, 18:48 17
Замечание к ответу №2 про нетипизированный файл.

Если собрались писать в файл только целые, открывать проще сразу с нужным размером элемента, тогда при записи/чтении можно будет указывать просто количество элементов:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const n=10;
var
  a: array [1..n] of Integer;
  i: Integer;
  f: file;
begin
  Assign(f,'file.bin');
 
  for i:=1 to 3 do a[i]:=4-i;
  for i:=4 to n do a[i]:=Sqr(i-4);
 
  Reset(f,SizeOf(a[Low(a)]));
  BlockWrite(f,a,n); { записываем n элементов массива одним вызовом }
  Close(f);
...
  Reset(f,SizeOf(a[Low(a)]));
  BlockRead(f,a,n); { читаем n элементов массива одним вызовом }
  Close(f);
 
  for i:=1 to n do Write(' ',a[i]); WriteLn;
end.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5169 / 3052 / 2300
Регистрация: 22.11.2013
Сообщений: 8,542
18.03.2019, 20:21 18
Пример чтения массива для случая, когда известно максимально возможное количество элементов, заданных в одной строке:
Pascal
1
2
3
4
5
6
7
8
9
const nMax=100;
var
  a: array [0..nMax-1] of Integer;
  n: Integer;
begin
  n:=0;
  while not EoLn do begin
    Read(a[n]); Inc(n);
  end; ReadLn;
Если компилятор поддерживает SeekEoLn:
Pascal
1
2
3
4
5
6
7
8
9
const nMax=100;
var
  a: array [0..nMax-1] of Integer;
  n: Integer;
begin
  n:=0;
  while not SeekEoLn do begin
    Read(a[n]); Inc(n);
  end; ReadLn;
Разница в поведении следующая:
в первом случае если после последнего в строке числа ввести пробел или иной пробельный символ, то считывание продолжится и на новой строке;
во втором случае считывание будет всегда завершено с окончанием текущей строки вне зависимости от наличия в конце пробельных символов.
0
18.03.2019, 20:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2019, 20:21

Объявление переменных-массивов
Совсем не шарю в массивах program sdf; type A=ARRAY of real; B=array of real; var i,j:word;...

Обработка двумерных массивов (матриц)
Ребят! Помогите пожалуйста! Задали в вузе ,нужно сделать обязательно для зачета. Заранее...

Написать объявление и описание класса, который вычисляет выражение
Написать объявление и описание класса, который вычисляет следующее выражение: t=(2*cos(x -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.