Аватар для STGE
773 / 578 / 324
Регистрация: 17.06.2009
Сообщений: 1,188

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

21.05.2010, 13:13. Показов 273798. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2010, 13:13
Ответы с готовыми решениями:

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

Написать программу на языке С++, содержащую объявление и описание дружественных структур
Всем добрый вечер, помогите разобраться с заданием, а именно как лучше сделать. И если не сложно, подскажите как реализовать программу...

Пользователь вводит длину массивов. Заполнение массивов случайными числами
Помогите доработать задачу В путем отсеивание из задачи А задачу Б (Язык С#) Пользователь вводит длину массивов. Заполнение массивов...

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

заполнение:

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
773 / 578 / 324
Регистрация: 17.06.2009
Сообщений: 1,188
28.05.2010, 02:11  [ТС]
Итак, перейдём к многомерным массивам:
Начнём с того, что такое многомерный массив - это упорядоченная совокупность однотипных данных, характеризуемая более чем одним параметром (индексирование массива по нескольким параметрам).
Пример: предположим точка на координатной плоскости отличается от остальных точек, своими координатами по оси 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
Раз уж перешли к двумерным массивам, то выкладываю примеры различных вариантов заполнений.
1) Заполнение "змейкой"
Например:
Code
1
2
3
4
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) Треугольник Паскаля
Например:
Code
1
2
3
4
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):
Code
1
2
3
4
5
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)
Например:
Code
1
2
3
4
5
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) Построение магического квадрата нечетного порядка
Магический квадрат-таблица, заполненная числами от 1 до https://www.cyberforum.ru/cgi-bin/latex.cgi?{n}^{2} таким образом, что сумма чисел во всех строках, столбцах и диагоналях одинакова. Более подробно можно посмотреть тут: http://ru.wikipedia.org/wiki/%... 0%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
02.06.2010, 13:35

Не по теме:

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

1
 Аватар для Unrealler
654 / 352 / 113
Регистрация: 11.12.2009
Сообщений: 508
02.06.2010, 14:10
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
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
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 3
07.06.2010, 12:05
А если необходимо заполнить массив по определенной траектории? Скажем, мне нужно в порядке убывания разместить элементы в направлении, указанном на рисунке:
Название: Безымянный.JPG
Просмотров: 35391

Размер: 8.7 Кб

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

PS пардон, возможна эта тема закрыта, но если именно здесь будет опубликован ответ, то, возможно, в дальнейшем не возникнет подобных вопросов (к тому же вопрос вполне по теме).
1
 Аватар для Unrealler
654 / 352 / 113
Регистрация: 11.12.2009
Сообщений: 508
08.06.2010, 14:26
8) Заполнение "треугольниками"
Пример:
Code
1
2
3
4
5
6
7
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
0 / 0 / 0
Регистрация: 05.04.2011
Сообщений: 3
05.04.2011, 23:45
А если по часовой стрелки с нижнего угла?

0
Почетный модератор
 Аватар для Puporev
64312 / 47609 / 32742
Регистрация: 18.05.2008
Сообщений: 115,168
06.04.2011, 09:29
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
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 11
03.05.2011, 23:56
вот у меня вопрос по теории :
В каких случаях целесообразно описывать двумерный массив с помощью одномерных?
0
Почетный модератор
 Аватар для Puporev
64312 / 47609 / 32742
Регистрация: 18.05.2008
Сообщений: 115,168
04.05.2011, 06:16
В случаях когда нужно производить действия в строках или столбцах, или при их перестановках в матрице.
Например обмен строк 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
Извиняюсь за туповатый вопрос, но как заменить в массиве четверти? т.е. был массив такой
Code
1
2
3
4
5
6
7
8
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
а нужно преобразовать в такой
Code
1
2
3
4
5
6
7
8
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
773 / 578 / 324
Регистрация: 17.06.2009
Сообщений: 1,188
25.05.2011, 02:12  [ТС]
Цитата Сообщение от 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
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 1
19.10.2016, 18:48
Замечание к ответу №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
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 1
18.03.2019, 20:21
Пример чтения массива для случая, когда известно максимально возможное количество элементов, заданных в одной строке:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2019, 20:21
Помогаю со студенческими работами здесь

Объявление массивов
Здравствуйте! В учебнике по языку массивы объявляются так int arr = new int; В книге Шилдта &quot;Java. Полное руководство&quot; ...

Объявление массивов
Здравствуйте хотел спросить и разобраться я работаю щас в компиляторе dev-c++ и при решении олимпиадной задачи когда отправил ее на...

Объявление массивов в С/С++
Пытаюсь создать матрицу размера n: #include &lt;iostream&gt; using namespace std; int main() { int n,i,j; int m; cout &lt;&lt;...

Объявление динамических массивов
Подскажите надо в массив типа: (запишу на дельфи языке) buf: array of byte; //dunamic massiv точно такой же массив надо...

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


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

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

Новые блоги и статьи
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
Mapped types (отображённые типы) в TypeScript
Reangularity 03.11.2025
Mapped types работают как конвейер - берут существующую структуру и производят новую по заданным правилам. Меняют модификаторы свойств, трансформируют значения, фильтруют ключи. Один раз описал. . .
Адаптивная случайность в Unity: динамические вероятности для улучшения игрового дизайна
GameUnited 02.11.2025
Мой знакомый геймдизайнер потерял двадцать процентов активной аудитории за неделю. А виновником оказался обычный генератор псевдослучайных чисел. Казалось бы - добавил в карточную игру случайное. . .
Протоколы в Python
py-thonny 31.10.2025
Традиционная утиная типизация работает просто: попробовал вызвать метод, получилось - отлично, не получилось - упал с ошибкой в рантайме. Протоколы добавляют сюда проверку на этапе статического. . .
C++26: Read-copy-update (RCU)
bytestream 30.10.2025
Прошло почти двадцать лет с тех пор, как производители процессоров отказались от гонки мегагерц и перешли на многоядерность. И знаете что? Мы до сих пор спотыкаемся о те же грабли. Каждый раз, когда. . .
Изображения webp на старых x32 ОС Windows XP и Windows 7
Argus19 30.10.2025
Изображения webp на старых x32 ОС Windows XP и Windows 7 Чтобы решить задачу, использовал интернет: поисковики Google и Yandex, а также подсказки Deep Seek. Как оказалось, чтобы создать. . .
Passkey в ASP.NET Core identity
stackOverflow 29.10.2025
Пароли мертвы. Нет, серьезно - я повторяю это уже лет пять, но теперь впервые за это время чувствую, что это не просто красивые слова. В . NET 10 команда Microsoft внедрила поддержку Passkey прямо в. . .
Последние результаты исследования от команды MCM (октябрь 2025 г.)
Programma_Boinc 29.10.2025
Последние результаты исследования от команды MCM (октябрь 2025 г. ) Поскольку мы продолжаем изучать гены, которые играют ведущую роль в развитии рака, в рамках проекта "Картирование раковых. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru