Форум программистов, компьютерный форум, киберфорум
Наши страницы

Pascal (Паскаль)

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 780, средняя оценка - 4.99
STGE
770 / 575 / 91
Регистрация: 17.06.2009
Сообщений: 1,188
#1

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

21.05.2010, 13:13. Просмотров 109304. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Описание, объявление и заполнение массивов (матриц) (Pascal):

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

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

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

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

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

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

16
STGE
770 / 575 / 91
Регистрация: 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
770 / 575 / 91
Регистрация: 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
652 / 350 / 26
Регистрация: 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
652 / 350 / 26
Регистрация: 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
652 / 350 / 26
Регистрация: 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
652 / 350 / 26
Регистрация: 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
Просмотров: 32227

Размер: 8.7 Кб

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

PS пардон, возможна эта тема закрыта, но если именно здесь будет опубликован ответ, то, возможно, в дальнейшем не возникнет подобных вопросов (к тому же вопрос вполне по теме).
1
Unrealler
652 / 350 / 26
Регистрация: 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
Модератор
52388 / 40235 / 13573
Регистрация: 18.05.2008
Сообщений: 92,986
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
Модератор
52388 / 40235 / 13573
Регистрация: 18.05.2008
Сообщений: 92,986
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;
Пишется как работа с линейным массивом.
0
.: TAPAKAH :.
Мега Таракан
110 / 11 / 1
Регистрация: 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
25.05.2011, 00:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2011, 00:06
Привет! Вот еще темы с ответами:

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

Чтение матриц с внешнего файла, умножение матриц... - Pascal
Вот не могу составить программу... Необходимо считать матрицы А и В с внешнего файла (input). Матрица А размерностью 5х7, В размерностью...

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

Написать объявление и описание класса, который вычисляет выражение - C++
Написать объявление и описание класса, который вычисляет следующее выражение: t=(2*cos(x - pi/2))/(0.5 + sin^2*y)*(1+(z^2)/(3-z^2/5))....


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

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

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