
- •Часть 1
- •Новосибирск
- •Информатика
- •Часть 1 Методические указания
- •630092, Г. Новосибирск, пр. К. Маркса, 20
- •Оглавление
- •1. Общие требования и порядок выполнения лабораторных работ
- •2. Работа в интегрированной среде visual studio
- •Исправление ошибок компиляции с помощью интегрированной среды разработки
- •Дополнительные средства интегрированной среды visual studio
- •Панель инструментов
- •Комплексные числа
- •Порядок выполнения работы
- •Структурная схема циклического алгоритма
- •Понятие массива. Его объявление и инициализация
- •Связь массивов и указателей
- •Вариант 17
- •Вариант 18
- •Вариант 19
- •Вариант 20
- •Вариант 21
Понятие массива. Его объявление и инициализация
Массив – это совокупность элементов одного типа, обозначаемых единым именем и размещенных в смежных ячейках памяти.
Простейший одномерный массив можно в общем случае объявить так:
class type name[size];
Здесь class – желаемый класс памяти, type – тип элементов массива, name – имя массива, size – количество элементов в массиве. Массивы могут иметь любой класс памяти, кроме, естественно, register.
Увидев такое объявление, компилятор автоматически резервирует под массив необходимое число байт ОЗУ, равное size*sizeof(type). Содержимое выделенных ячеек памяти зависит от указанного класса памяти, который выбирается программистом точно так же, как и для простых переменных. Если указан класс памяти auto, то до первого явного присваивания выделенные ячейки содержат "мусор", при указании класса static все элементы массива автоматически обнуляются.
Если значения элементов массива известны при написании программы (т. е. являются исходными данными), то часто массив инициализируется одновременно с его объявлением:
int first[5] = {3, 7, –4, 0, 25};
Количество констант требуемого типа, перечисленных через запятую в фигурных скобках, может быть меньше, чем длина массива. Тогда оставшиеся элементы инициализируются нулем. Если же численные значения получают все элементы массива, то его размерность в принципе можно и не указывать – компилятор сам ее подсчитает по количеству констант:
int first[] = {3, 7, –4, 0, 25};
Для обращения к конкретному элементу массива достаточно указать его индекс, например m = first[2]; в результате чего переменная m примет численное значение элемента first[2], равное –4. Это получилось потому, что в языке С++ индексы массивов начинаются с нуля! Можно сказать, что индекс элемента характеризует его удаленность от начала массива.
В данном примере объявлен массив из пяти целых чисел, причем к первому из них можно обратиться как first[0], а к пятому – как first[4].
Обычно к элементам массива обращаются в цикле, число повторений которого равно, как правило, количеству элементов массива n:
for(i = 0; i < n; i++)
{
.......first[i]......
}
Связь массивов и указателей
Каждая область памяти, которую вы используете для хранения данных, имеет свой адрес. Адрес позволяет компьютеру обращаться к определенному элементу данных.
Указатель – это переменная, которая хранит адрес другой переменной определенного типа. Фактически это просто адрес одного байта оперативной памяти, с которого начинается размещение этой переменной. Переменная указатель, как и любая другая переменная, обладает именем, а также имеет тип, определяющий то, на какого рода данные она может указывать. При помощи указателей удобно выполнить многие действия:
получить доступ к содержимому любой ячейки памяти;
создать новые объекты (переменные, массивы, структуры и т. п.) в процессе выполнения программы путем динамического резервирования памяти;
облегчить передачу фактических параметров функциям, передавая не сам объект (который может быть довольно большим), а только его начальный адрес.
Как и любая переменная, каждый указатель должен быть описан и инициализирован перед использованием.
Чтобы объявить указатель, нужно выбрать для него имя, перед которым поставить звездочку, а перед звездочкой записать тип переменной или объекта, чей адрес будет храниться в указателе.
Приведем примеры объявления простейших указателей:
int *p1; – указатель на целое;
char *p2; – указатель на символ;
double *p3; – указатель на вещественную переменную
двойной точности.
Особенностью языка С++ является тот факт, что имя одномерного массива (без индексов и квадратных скобок!) можно рассматривать как переменную, всегда хранящую адрес начала массива, т. е. как неизменяемый указатель на первый байт участка памяти, выделенного под массив. Ему невозможно присвоить другой адрес, но продублировать этот адрес в другой указатель удобно и выгодно:
int first[] = {3, 7, –4, 0, 25}; /* Объявляем массив целых */
nt *pt; /* Вводим указатель на целое */
pt = first; /* Заносим в указатель адрес начала массива */
Занесение адреса в указатель можно было реализовать и по-другому:
pt = &first[0];
Учтите, что операцию взятия адреса нельзя применять к имени массива, поскольку оно уже адекватно адресу начала массива:
pt = &first; /* Так писать нельзя ! */
Может возникнуть вполне законный вопрос – зачем произведено дублирование адреса? Ведь теперь first и pt адресуют один и тот же байт памяти. Однако имя массива по определению – это неизменяемый указатель, а указатель pt можно изменять, т. е. допустимо изменять адрес, который он содержит. Тем самым мы можем "сдвинуть" указатель так, чтобы он стал указывать на нужный элемент массива. Этот "сдвиг" происходит при выполнении над указателями разрешенных арифметических операций.
Арифметические операции над указателями
Над указателями (т. е. адресами) можно производить некоторые целочисленные арифметические операции. Чаще всего к указателю прибавляют целую константу или вычитают ее из указателя. Очень важно понять, что эти действия выполняются в единицах того типа, который указан при объявлении указателя. Так, если в программе объявлен указатель на целый объект:
int *pt;
и в него занесен некоторый адрес:
pt = first;
то адрес (pt+1) будет отстоять от исходного на размер целой переменной. Если по этому адресу размещена целая величина, то доступ к ней можно получить способом разадресации указателя: *(pt+1). Заметим, что это можно реализовать и по-другому: *(++pt).
Такая запись предписывает сначала увеличить адрес, хранимый в указателе, на sizeof(type) единиц, а затем извлечь операнд, размещенный по новому адресу.
Даже если не введен изменяемый указатель-дублер, то выражение (first+k) также определяет адрес k-го элемента, а выражение *(first+k) – содержимое по данному адресу. Никакого нарушения синтаксиса здесь нет, поскольку указатель-константа, каковым является имя массива, не изменяется, а лишь участвует в выражении на правах слагаемого. Однако записи first++ или *first++ недопустимы.
При желании указатель, которому присвоен адрес начала массива, можно использовать вместо имени массива при обращении к элементу массива по индексу. Так, вполне корректно писать:
int first[] = {....};
int *pt,m;
pt = first;
m = pt[3];
Последний оператор можно записать и иначе:
а) m = first[3];
б) m = *(first+3);
Приведем текст простой программы, создающей одномерный целочисленный массив и заполняющей его первыми числами натурального ряда чисел:
int mas[10], i;
for(i = 0; i < 10; i++)
mas[i] = i;
При обращении к элементам массива через указатель один из возможных вариантов таков:
int mas[10], i, *pt;
pt = mas;
for(i = 0; i < 10; i++)
*pt++ = i;
Конечно, можно обойтись и без указателя pt:
int mas[10], i;
for(i = 0; i < 10; i++)
*(mas+i) = i;
Порядок выполнения работы
1. Составить схему алгоритма и предъявить ее преподавателю для проверки.
2. Написать программу двумя способами: с помощью указателей и без нее.
3. Отладить программу и получить численные результаты.
4. Оформить отчет по работе, обратив особое внимание на выводы. Подготовиться к защите, ориентируясь на контрольные вопросы. Защитить работу.
Варианты заданий
Вариант 1
Дан целочисленный массив A [15]. Найти в нем два наименьших элемента.
Вариант 2
По заданному вещественному
x
вычислить значение
по следующей итерационной формуле: yi+1
=0.5(yi
+
x/yi)
, y0
= x.
Итерации прекратить при |yi+1
–
yi|
<
2×10-5.
Вариант 3
Дано положительное число a. Найти k-е число Фибоначчи такое, что xk–1 £ a < xk. Числа Фибоначчи: x1 = x2 = 1, xk = xk-2 + xk-1, k = 3, 4, …
Вариант 4
Найти количество трехзначных чисел в массиве A[12], кратных 15, но не кратных 30. Вывести их на экран монитора.
Вариант 5
Сформировать целочисленный массив A[10], элементами которого являются случайные числа из диапазона [–5; 20]. Найти среди его элементов два, разность которых имеет наибольшее значение.
Вариант 6
Вычислить, не используя функцию pow(), значения функции z(x, m) = = xm sinm(x) для значений аргументов: x от –1.1 до 0.3 с шагом 0.2; m от 1 до 5 с шагом 1.
Вариант 7
Произведено измерение роста 15 студентов. Данные записаны в массиве ROST. Разместить в массиве NR номера тех студентов, чей рост меньше 180 см и подсчитать число таких студентов.
Вариант 8
Сформировать массив IM[100], элементами которого являются числа 1, –1, 2, –2, …, 50, –50. Сформировать массив IN[50], элементами которого являются числа 1, 3, 5, …, 49, 50, 48, 46, …, 2. Вывести их на экран монитора.
Вариант 9
По заданному вещественному
числу x
вычислить значение
по следующей итерационной формуле:
yi+1=
0.5(yi
+
3x/(2yi2
+
x/yi)),
y0
= x.
Итерации прекратить при |yi+1
–
yi|
<
10–5.
Вариант 10
Сформировать целочисленный массив A[15], элементами которого являются случайные числа из диапазона [–8; 10]. Найти среди его элементов два, модуль разности которых имеет наибольшее значение.
Вариант 11
Вычислить значение функции
для значений
аргументов x
от 0.2 до 0.6 с шагом 0.1; y
от 0 до 0.4 с шагом 0.05.
Вариант 12
Сформировать целочисленный массив IM[17], элементами которого являются случайные числа из диапазона [3; 42]. Подсчитать сумму элементов массива, значения которых кратны восьми.
Вариант 13
Дан массив A[15]. Найти пару соседних элементов, наиболее близко расположенных друг к другу, т. е. для которых минимален модуль разности R = |A[i+1] – A[i]|.
Вариант 14
Дан массив X[13]. Найти сумму элементов массива, предшествующих первому отрицательному элементу. Если такового нет, то просуммировать все элементы.
Вариант 15
Сформировать квадратную матрицу A[15][15] следущего типа:
Вариант 16
Сформировать массив IM[100], элементами которого являются числа 1, 100, 2, 99, …, 50, 51.
Вариант 17
По заданному вещественному x вычислить значение по следующей итерационной формуле: yi+1 = 1/3*(2yi + x/yi2), y0 = x. Итерации прекратить при |yi+1 – yi| < 10–5.
Вариант 18
Сформировать целочисленный массив A[20], элементами которого являются случайные числа из диапазона [–2; 3]. Определить, сколько раз в нем встречались два подряд идущих нулевых элемента.
Вариант 19
Дан целочисленный массив C[12]. Сформировать матрицу A, первая строка которой будет содержать элементы массива с четными номерами, а вторая – с нечетными.
Вариант 20
Сформировать вещественный массив A1[15], элементами которого являются случайные числа из диапазона [–2; 3]. Переслать из него в массив A2 все элементы, значения которых больше –1.8 и меньше 2.7
Вариант 21
Даны вещественные числа A и B (A < B). Найти первый член последовательности an = (–1)n(1 + 1/2 + … + 1/n), который не принадлежит [A; B].
Вариант 22
В заданном целочисленном массиве распечатать те элементы, порядковые номера которых – числа Фибоначчи.
Вариант 23
В заданном целочисленном массиве определить количество перемен знаков.
Вариант 24
Дан массив X[20]. Перепечатать в массив Y элементы массива X с нечетными номерами, а в массив Z – элементы массива X, значения которых кратны пяти.
Вариант 25
Даны вещественные числа A, B, C, A1, B1, C1. Выяснить взаимное расположение прямых Ax + By = C и A1x + B1y = C1. Если прямые пересекаются, напечатать координаты точки пересечения.
Вариант 26
Даны вещественные числа A
<
0 и B
>
0. Найти первый член последовательности
,
который не принадлежит отрезку [A;
B].
Вариант 27
Дан целочисленный массив A[5]. Определить, образуют ли его элементы неубывающую последовательность.
Вариант 28
Среди 10 введенных чисел xi распечатать те числа, которые удовлетворяют условию |xi| < i2. Если таких чисел нет – выдать сообщение.
Вариант 29
Дана матрица B[3][6]. Найти сумму элементов каждого столбца матрицы. Сформировать массив D из найденных сумм.
Вариант 30
Дан вещественный массив X[16] и вещественное число N. Вывести на экран монитора все элементы массива, которые одного знака с числом N.
Контрольные вопросы
Объясните работу условного оператора.
Какие операторы цикла вам известны? Разъясните принцип их работы.
Из каких соображений выбирается переменная, играющая роль параметра цикла?
Что такое массив?
Дайте определение указателю.
Поясните связь массивов и указателей.
Назначение операторов break и continue.
Каков результат выполнения фрагмента? Приведите пример.
for(i=1,n=0;i<10;i++) if(a[i]>a[n]) n=i;
Каков результат выполнения фрагмента? Приведите пример.
for(i=0,n=-1;i<10;i++)
{ if(a[i]<=0) continue; if(n== –1||a[i]<a[n]) n=i; }
Каков результат выполнения фрагмента? Приведите пример.
do
{ found=0;
for(i=0;i<n-1;i++)
if(A[i]>A[i+1]) { int cc; cc=A[i];A[i]=A[i+1]; A[i+1]=cc; found++; }
}while(found!=0);}
Лабораторная работа № 3
Вычисление сумм и произведений
Цель работы
Закрепление навыков стандартных приемов программирования.
Порядок выполнения работы
Составить схему алгоритма и предъявить ее преподавателю для проверки.
Написать программу двумя способами: с помощью указателей и без нее.
Отладить программу и получить численные результаты.
Оформить отчет по работе, обратив особое внимание на выводы. Подготовиться к защите, ориентируясь на контрольные вопросы. Защитить работу.
Варианты заданий
Вариант 1
Дан массив a из n
действительных чисел. Используя
указатели, вычислить
.
Вариант 2
Дан массив a из n
действительных чисел. Используя
указатели, вычислить
.
Вариант 3
Дан массив a из n
действительных чисел. Используя
указатели, вычислить
.
Вариант 4
Дан массив a из n
действительных чисел. Используя
указатели, вычислить
.
Вариант 5
Дан массив a из n
действительных чисел. Используя
указатели, вычислить
.
Вариант 6
Дан массив a из n
действительных чисел. Используя
указатели, вычислить
.
Вариант 7
Дан массив a из n
действительных чисел. Используя
указатели, вычислить
.
Вариант 8
Дан массив a из n действительных чисел. Используя указатели, заполнить массив B, элементы которого имеют вид
{a0, a0 ++ a1, …, a0 + a1 + … + an–1}.
Вариант 9
Дан массив a из n действительных чисел. Используя указатели, заполнить массив B, элементы которого имеют вид
{a02, a0 a1, a0a2, …, a0 an–1}.
Вариант 10
Дан массив a из n действительных чисел. Используя указатели, заполнить массив B, элементы которого имеют вид
{|a0|, |a0 + a1|,…, |a0 + a1 + … + an-1|}.
Вариант 11
Дан массив a из n действительных чисел. Используя указатели, заполнить массив B, элементы которого имеют вид
{a0, –a0 a1, a0 a1a2,…, (–1)n a0 a1…an-1}.
Вариант 12
Дан массив a из n действительных чисел. Используя указатели, заполнить массив B, элементы которого имеют вид
{–a0, a1, –a2, …, (–1)n an-1}.
Вариант 13
Дан массив a из n действительных чисел. Используя указатели, заполнить массив B, элементы которого имеют вид
{a0 + 1!, a1 + 2!,…, an-1 + n!}.
Вариант 14
Задан массив x[n]. Используя указатели, заполнить его по закону x0 = 0, x1 = 5/8, xi = xi-1/2+3xi-2/4 и найти сумму элементов массива.
Вариант 15
Задан массив x[n]. Используя указатели, заполнить его по закону x0 = 1, x1 = 0,3, xi = (i + 1)xi-2 и найти минимальный элемент массива.
Вариант 16
Задан массив x[n]. Используя указатели, заполнить его по закону x0 = x1 = x2 = 1, xi = (i + 3)(xi-1 – 1) + (i + 4)xi-3 и найти произведение элементов массива.
Вариант 17
Задан массив a[m].
Известно, что a0
> 0 и что среди элементов массива
есть хотя бы один отрицательный. Пусть
первый отрицательный элемент an.
Получить
.
Вариант 18
Задан массив a[m].
Известно, что a0
< 0 и что среди элементов массива есть
хотя бы один положительный. Пусть первый
положительный элемент an.
Получить
.
Вариант 19
Задан целый массив a[m]. Известно, что среди элементов массива есть хотя бы один элемент, равный –2. Пусть этот первый элемент an. Получить среднее арифметическое a0, …, an-1.
Вариант 20
Задан массив a[m]. Известно, что все его элементы > 0. Получить среднее геометрическое a0, …, am-1.
Вариант 21
Задан целый массив a[m].
Найти
.
Вариант 22
Задан целый массив c[m].
Найти
.
Вариант 23
Задан массив a[m]. Известно, что a0 > 0 и что среди элементов массива есть хотя бы один отрицательный. Пусть первый отрицательный элемент an. Вычислить (–1)n an.
Вариант 24
Задан массив a[m]. Известно, что a0 < 0 и что среди элементов массива есть хотя бы один положительный. Пусть первый положительный элемент an. Вычислить n + an.
Вариант 25
Задан целый массив a[m]. Известно, что среди элементов массива есть хотя бы один элемент, равный 10. Пусть первый этот элемент an. Вычислить |a0 – an|.
Вариант 26
Задан целый массив k[12]. Найти его минимальный элемент. Вычислить сумму элементов, следующих за ним.
Вариант 27
Задан целый массив r[10]. Найти его максимальный элемент. Вычислить произведение элементов, стоящих до него.
Вариант 28
Задан целый массив q[11] и целое число gÎ[0; 11). Найти среднее арифметическое всех элементов массива, кроме q[j].
Вариант 29
Задан вещественный массив a[15].
Изменить все его элементы, кроме первого
и последнего, по формуле
,
используя лишь старые значения элементов
массива.
Вариант 30
Задан вещественный массив c[11] и вещественное g. Найти такой индекс i элемента массива, чтобы |ci – g| был минимален.
Контрольные вопросы
Что является адресом одномерного массива?
Как записываются индексы ячеек массива с помощью указателя?
Как находится сумма элементов одномерного массива?
Как находится произведение элементов одномерного массива?
Чем отличаются выражения *(p++) и (*p)++, если p – указатель?
Как поменять местами значения в ячейках с одинаковыми индексами двух одномерных массивов?
Лабораторная работа № 4
Программирование операций с матрицами
Цель работы
Приобретение навыков программирования циклических вычислительных алгоритмов с использованием массивов на примерах операций с матрицами. Закрепление навыков оперирования с массивами и их элементами, а также применение указателей в среде языка С++.
Пояснения к работе
Матрицей [A] называется упорядоченная система из n*m величин, расположенных в прямоугольной таблице из m строк и n столбцов. Величины a[i][j] (i = 0, 2,...,m; j=0, 2,...,n) называются элементами матрицы. Индекс i обозначает номер строки, j – номер столбца. Если m = n, то матрица называется квадратной порядка n. Следом матрицы [A] размером n*n называется сумма ее диагональных элементов. Любая матрица представляется в программе в виде двумерного массива величин. В языке С++ есть свои особенности в работе с массивами.
Напомним, что массив можно определить как совокупность величин одного типа, обозначаемых общим именем и размещенных в смежных ячейках памяти. Каждый массив необходимо объявить и по мере необходимости инициализировать.
Пример объявления для двумерного массива: int dvum [2][3].
Эта запись означает, что объявляется массив целого типа, содержащий две строки и три столбца.
Инициализация такого массива может выглядеть так:
int dvum [2][3] = {
{1, 2, 3},
{4, 5, 6}
}.
Допустима более простая форма записи:
int dvum [2][3]={1, 2, 3, 4, 5, 6}.
Подчеркнем следующие особенности языка С++. Размер массива, а также индексы элементов записываются в квадратные скобки. В случае многомерного массива каждый индекс заключается в свои скобки. Нумерация индексов начинается с нуля. Например, atr [3][4] означает элемент матрицы, размещенный в четвертой строке и в пятом столбце. В памяти элементы матрицы располагаются по строкам.
Для вывода матриц в языке С++ можно использовать оператор cout, включив его в соответствующий цикл. Каждое очередное обращение к cout не приводит к переводу строки, и организация перевода строки возлагается на пользователя. Ниже приводится фрагмент программы, обеспечивающий вывод матрицы [A] в естественном виде.
for (i=0; i<=n; i++)
{
cout<<"\n";
for (j=0; j<=m; j++)
cout<< A[i][j]);
}
Действия с матрицами
Результатом сложения (вычитания) двух матриц [A] и [B] одинакового размера является матрица [C] такого же размера. Элементы матрицы C равны сумме (разности) соответствующих элементов матриц [A] и [B], т. е.
Cij=Аij+Вij – для сложения,
Cij=Аij–Вij – для вычитания,
i=0,1,2,...,m–1, j=0,1,2,...,n–1 в языке Си.
Умножение матриц. При умножении матриц [A] и [B] необходимо, чтобы число столбцов матрицы [A] было равно числу строк матрицы [B]. Если рассмотреть умножение квадратных матриц одинакового порядка n, то результатом умножения будет квадратная матрица [C] того же порядка. Элементы квадратной матрицы
[C] получаются по следующему правилу:
,
т. е. чтобы получить произвольный
элемент Cij,
стоящий в i-й строке и j-м столбце
матрицы [C], нужно элементы i-й строки
матрицы [A] умножить на соответствующие
элементы j-го столбца матрицы [B] и
полученные произведения сложить.
Схема алгоритма программы умножения матриц показана на рис. 4.1.
Рис. 4.1. Схема алгоритма умножения матриц
Порядок выполнения работы
Составить программу, соответствующую заданному варианту.
Ввести текст программы в ЭВМ, отладить программу на тестовых примерах.
Результаты работы (отлаженный код программы, результаты счета) предъявить преподавателю.
Оформить отчет и защитить работу, убедившись в своей готовности по контрольным вопросам.
Варианты заданий
Вариант 1
Задана целая матрица X[3][4]. Вычислить минимальный элемент каждого столбца этой матрицы.
Вариант 2
Задана комплексная матрица Y[4][4]. Найти сумму элементов на ее побочной диагонали.
Вариант 3
Задана вещественная матрица Z[3][2]. Вычислить сумму ее положительных элементов и произведение отрицательных.
Вариант 4
Задана целая матрица T[3][4]. Вычислить произведение элементов, стоящих до первого отрицательного, в каждой строке матрицы. Считать, что в каждой строке присутствует отрицательный элемент.
Вариант 5
Задана вещественная матрица Q[5][2]. Вычислить сумму ее элементов, выделенных на рис. 4.2 серым цветом.
|
|
|
|
|
|
|
|
|
|
Рис. 4.2. Элементы матриц
Вариант 6
Задана целая матрица E[5][5]. Найти минимальный элемент среди элементов над главной диагональю (не включая саму диагональ).
Вариант 7
Задана вещественная матрица D[2][5]. Вычислить сумму элементов, стоящих до первого положительного, в каждом столбце матрицы. Считать, что в каждом столбце присутствует положительный элемент.
Вариант 8
Задана целая матрица C[4][4]. Найти минимальный элемент ее побочной диагонали.
Вариант 9
Задана комплексная матрица B[4][3]. Вычислить произведение ее элементов, выделенных на рис. 4.3 серым цветом.
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 4.3. Элементы матриц
Вариант 10
Задана вещественная матрица A[4][2]. Найти максимальный элемент каждой строки этой матрицы.
Вариант 11
Задана комплексная матрица K[4][4]. Найти сумму элементов под главной диагональю матрицы (не включая саму диагональ).
Вариант 12
Задана целая матрица I[5][3]. Найти количество элементов матрицы, попадающих в интервал [–3; 8].
Вариант 13
Задана целая матрица R[4][5]. Найти произведение ее элементов, кратных трем, но не кратных пяти.
Вариант 14
Задана целая матрица L[4][2]. Поменять в ней местами первую и вторую строки.
Вариант 15
Задана вещественная матрица M[3][4]. Поменять в ней местами первый и третий столбцы.
Вариант 16
Задана целая матрица A[5][5]. Переписать в массив B[25] элементы матрицы A по спирали по часовой стрелке, начиная с элемента, первого в строке и столбце (рис. 4.4).
® |
® |
® |
® |
® |
|
® |
® |
® |
¯ |
|
|
® |
¯ |
¯ |
|
¬ |
¬ |
¯ |
¯ |
¬ |
¬ |
¬ |
¬ |
¯ |
Рис. 4.4. Принцип формирования массива В [25]