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

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

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

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

Итак, начнём с видов описания одномерного массива (при описании массивов будет использоваться базовый тип 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2010, 13:13
Ответы с готовыми решениями:

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

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

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

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

Задачи на обработку двухмерных массивов(матриц).
Пожалуйста Help!!!! 1). Определить след матрицы Т(3,3), минимальный элемент...

16
STGE
771 / 576 / 324
Регистрация: 17.06.2009
Сообщений: 1,188
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,188
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
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
Просмотров: 32530

Размер: 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
Модератор
55464 / 42571 / 29422
Регистрация: 18.05.2008
Сообщений: 100,712
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
Модератор
55464 / 42571 / 29422
Регистрация: 18.05.2008
Сообщений: 100,712
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,188
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
4147 / 2740 / 2173
Регистрация: 22.11.2013
Сообщений: 7,662
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
19.10.2016, 18:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2016, 18:48

Заполнение массивов исходных данных
Сижу на экзамене:( вообще не представляю как эти задачи написать.

Транспонирование массива и заполнение массивов по формулам.
Помогите решить, кому не трудно 1) Транспортировать массив (т.е. a1,a2...an...

Составить описание класса одномерных массивов строк, где каждая строка задается длиной и указателем.....
Составить описание класса одномерных массивов строк, где каждая строка задается...


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

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

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