Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы по темам.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.3 Mб
Скачать

Задачи для самостоятельного решения

Каждый студент должен решить в разделе “Линейные массивы” по одной задаче из блоков А и В, по две задачи из блока Б; в разделе “Двумерные массивы” – по две задачи из каждого блока.

Линейные массивы

А

1.     Дан массив натуральных чисел. Найти сумму элементов, кратных данному К.

2.     В целочисленной последовательности есть нулевые элементы. Создать массив из номеров этих элементов.

3.     Дана последовательность целых чисел a1, a2, ..., an. Выяс­нить, какое число встречается раньше — положительное или отрицательное.

4.     Дана последовательность действительных чисел a1, a2, ..., an. Выяснить, будет ли она возрастающей.

5.     Дана последовательность натуральных чисел a1, a2, ..., an. Со­здать массив из четных чисел этой последовательности. Если таких чисел нет, то вывести сообщение об этом факте.

6.     Дана последовательность чисел a1, a2, ..., an. Указать на­именьшую длину числовой оси, содержащую все эти числа.

7.     Дана последовательность действительных чисел a1, a2, ..., an. Заменить все ее члены, большие данного Z, этим числом. Под­считать количество замен.

8.     Последовательность действительных чисел оканчивается нулем. Найти количество членов этой последовательности.

9.     Дан массив действительных чисел, размерность которого N. Подсчитать, сколько в нем отрицательных, положительных и нулевых элементов.

10.  Даны действительные числа a1, a2, ..., an. Поменять местами наибольший и наименьший элементы.

11.  Даны целые числа a1, a2, ..., an. Вывести на печать только те числа, для которых выполняется ai. i.

12.  Даны натуральные числа a1, a2, ..., an. Указать те, у которых остаток от деления на М равен L (0  L  М–1).

13.  В заданном одномерном массиве поменять местами соседние элементы, стоящие на четных местах, с элементами, стоящи­ми на нечетных.

14.  При поступлении в вуз абитуриенты, получившие “двойку” на первом экзамене, ко второму не допускаются. В массиве А [n] записаны отметки экзаменующихся, полученные на пер­вом экзамене. Подсчитать, сколько человек не допущено ко второму экзамену.

15.  Дана последовательность чисел, среди которых имеется один нуль. Вывести на печать все числа, включительно до нуля.

16.  В одномерном массиве размещены: в первых элементах значе­ния аргумента, в следующих — соответствующие им значе­ния функции. Напечатать элементы этого массива в виде двух параллельных столбцов (аргумент и значения функции).

17.  Пригодность детали оценивается по размеру В, который дол­жен соответствовать интервалу (А – , А + ). Определить, имеются ли в партии из N деталей бракованные. Если да, то подсчитать их количество, иначе выдать отрицательный ответ.

18.  У вас есть доллары. Вы хотите обменять их на рубли. Есть ин­формация о стоимости купли-продажи в банках города. В го­роде N банков. Составьте программу, определяющую, какой банк выбрать, чтобы выгодно обменять доллары на рубли.

19.  Дан целочисленный массив с количеством элементов n. Напе­чатать те его элементы, индексы которых являются степеня­ми двойки (1, 2, 4, 8, 16, ...).

Б

1.     Дан одномерный массив A[N]. Найти max {a2, a4, ..., а2k} + min {а1, а3, …, a2k+1}.

2.     Дана последовательность действительных чисел a1, a2, ..., аn. Указать те ее элементы, которые принадлежат отрезку [с, d].

3.     Дана последовательность целых положительных чисел. Найти произведение только тех чисел, которые больше задан­ного числа М. Если таких нет, то выдать сообщение об этом.

4.     Последовательность a1, a2, ..., аn состоит из нулей и единиц. Поставить в начало этой последовательности нули, а затем единицы.

5.     Даны действительные числа a1, a2, ..., аn. Среди них есть по­ложительные и отрицательные. Заменить нулями те числа, величина которых по модулю больше максимального числа (|аi| > max { a1, a2, ..., аn}).

6.     Даны действительные числа a1, a2, ..., аn. Найти max {a1+ an, a2+ an-1, ..., аk+ an-(k-1)}

7.     В последовательности действительных чисел a1, a2, ..., аn есть только положительные и отрицательные элементы. Вычис­лить произведение отрицательных элементов Р1 и произведе­ние положительных элементов Р2. Сравнить модуль Р1 моду­лем Р2, указать, какое из произведений по модулю больше.

8.     Дан массив действительных чисел. Среди них есть равные. Найти первый максимальный элемент массива и заменить его нулем.

9.     Дана последовательность действительных чисел a1  a2, ... аn. Вставить действительное число b в нее так, чтобы последовательность осталась неубывающей.

10.  Даны целые положительные числа a1, a2, ..., аn. Найти среди них те, которые являются квадратами некоторого числа m.

11.  Дана последовательность целых чисел a1, a2, ..., аn. Образо­вать новую последовательность, выбросив из исходной те члены, которые равны min {a1, a2, ..., аn}.

12.  У прилавка магазина выстроилась очередь из n покупателей. Время обслуживания i-того покупателя равно ti (i =1, ...., n). Определить время Ci пребывания i-го покупателя в очереди.

13.  Секретный замок для сейфа состоит из 10 расположенных в ряд ячеек, в которые надо вставить игральные кубики. Но дверь открывается только в том случае, когда в любых трех соседних ячейках сумма точек на передних гранях кубиков равна 10. (Игральный кубик имеет на каждой грани от 1 до 6 точек.) Напишите программу, которая разгадывает код замка при условии, что два кубика уже вставлены в ячейки.

14.  В массиве целых чисел с количеством элементов n найти наи­более часто встречающееся число. Если таких чисел несколь­ко, то определить наименьшее из них.

15.  Каждый солнечный день улитка, сидящая на дереве, подни­мается вверх на 2 см, а каждый пасмурный день опускается вниз на 1 см. В начале наблюдения улитка находилась в A см от земли на B-метровом дереве. Имеется 30-элементный мас­сив, содержащий сведения о том, был ли соответствующий день наблюдения пасмурным или солнечным. Написать про­грамму, определяющую местоположение улитки к концу 30-го дня наблюдения.

16.  Дан целочисленный массив с количеством элементов n. “Со­жмите” массив, выбросив из него каждый второй элемент. Дополнительный массив не использовать.

17.  Задан массив, содержащий несколько нулевых элементов. Сжать его, выбросив эти элементы.

18.  Задан массив с количеством элементов N. Сформируйте два массива: в первый включите элементы исходного массива с четными номерами, а во второй — с нечетными.

19.  Дана последовательность целых чисел a1, a2, ..., аn. Указать пары чисел ai, aj, таких, что ai + aj = m.

20.  Даны целые числа a1, a2, ..., аn. Наименьший член этой после­довательности заменить целой частью среднего арифметичес­кого всех членов, остальные члены оставить без изменения. Если в последовательности несколько наименьших членов, то заменить последний по порядку.

21.  Даны целые числа a1, a2, ..., аn и b1, b2, ..., bn. Преобразовать последовательность b1, b2, ..., bn по правилу: если ai  0, то bi увеличить в 10 раз, иначе заменить bi нулем (i = 1, 2, ..., n).

22.  Даны действительные числа a1, a2, ..., аn. Требуется умно­жить все члены последовательности a1, a2, ..., аn на квадрат ее наименьшего члена, если ak  0, и на квадрат ее наибольшего члена, если ak < 0 (1  k  n).

23.  Даны координаты n точек на плоскости: (X1, У1), ..., (Xn, Yn) (n  30). Найти номера пары точек, расстояние между которы­ми наибольшее (считать, что такая пара единственная).

24.  Дана последовательность из n различных целых чисел. Найти сумму ее членов, расположенных между максимальным и ми­нимальным значениями (в сумму включить и оба этих числа).

25.  Японская радиокомпания провела опрос N радиослушателей по вопросу: “Какое животное Вы связываете с Японией и японцами?” Составить программу получения k наиболее часто встречающихся ответов и их долей (в процентах).

26.  Дан массив, состоящий из n натуральных чисел. Образовать новый массив, элементами которого будут элементы исходно­го, оканчивающиеся на цифру k.

27.  Дан массив целых чисел. Найти в этом массиве минимальный элемент m и максимальный элемент М. Получить в порядке возрастания все целые числа из интервала (m; М), которые не входят в данный массив.

28.  Дано действительное число x и массив А [n]. В массиве найти два члена, среднее арифметическое которых ближе всего к x.

29.  Даны две последовательности a1, a2, ..., аn и b1, b2, ..., bm (m < n). В каждой из них члены различны. Верно, ли что все члены второй последовательности входят в первую последователь­ность?

30.  Напишите программу, входными данными которой является возраст n человек. Программа подсчитывает количество людей, возраст которых находится в интервале 10 лет, а именно: <…> человек имеет возраст в диапазоне 0-10 лет; <..> человек имеет возраст в диапазоне 10-20 лет и т.д.

В

1.В одномерном массиве все отрицательные элементы перемес­тить в начало массива, а остальные — в конец с сохранением порядка следования. Дополнительный массив заводить не разрешается.

2.В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагают­ся в следующем порядке: x1, y1, x2, y2, x3, y3 и т.д. Опреде­лить минимальный радиус круга с центром в начале коорди­нат, который содержит все точки.

3.В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагают­ся в следующем порядке: x1, y1, x2, y2, x3, y3 и т.д. Опреде­лить кольцо с центром в начале координат, которое содержит все точки.

4.В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагают­ся в следующем порядке: x1, y1, x2, y2, x3, y3 и т.д. (xi, уi — целые). Определить номера точек, которые могут являться вершинами квадрата.

5.В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагают­ся в следующем порядке: x1, y1, x2, y2, x3, y3 и т.д. Опреде­лить номера точек, которые могут являться вершинами рав­нобедренного треугольника.

6.Задан целочисленный массив размерности N. Есть ли среди элементов массива простые числа? Если да, то вывести номера этих элементов.

7.Дана последовательность целых чисел. Найти количество раз­личных чисел в этой последовательности.

8.Дан массив из n натуральных четырехзначных чисел. Вывес­ти на экран только те, у которых сумма первых двух цифр равна сумме двух последних.

9.Даны две последовательности целых чисел a1, a2, ..., аn и b1, b2, ..., bn. Все члены последовательностей — различные числа. Найти, сколько членов первой последовательности совпадают с членами второй последовательности.

10.  Дан целочисленный массив А [n], среди элементов есть одина­ковые. Создать массив из различных элементов А [n].

11.  На плоскости n точек заданы своими координатами и также дана окружность радиуса R с центром в начале координат. Указать множество всех треугольников с вершинами в задан­ных точках, пересекающихся с окружностью; множество всех треугольников, содержащихся внутри окружности.

12.  В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагают­ся в следующем порядке: x1, y1, x2, y2, x3, y3 и т.д. Найти но­мера самых удаленных друг от друга точек и наименее уда­ленных друг от друга точек.

13.  В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагаются в следующем порядке: x1, y1, x2, y2, x3, y3 и т.д. Опреде­лить три точки, которые являются вершинами треугольника, для которого разность числа точек вне него и внутри является минимальной.

14.  Заданы два одномерных массива с различным количеством элементов и натуральное число k. Объединить их в один мас­сив, включив второй массив между k-м и (k+1)-м элементами первого, не используя дополнительный массив.

15.  Даны две последовательности a1  a2  ...  аn и b1  b2  ...  bm. Образовать из них новую последовательность чисел так, чтобы она тоже была неубывающей. Дополни­тельный массив не использовать.

16.  Сортировка выбором. Дана последовательность чисел a1, a2, ..., аn. Требуется переставить элементы так, чтобы они были расположены по убыванию. Для этого в массиве, начиная с первого, выбирается наибольший элемент и ставится на пер­вое место, а первый — на место наибольшего. Затем, начиная со второго, эта процедура повторяется. Написать алгоритм сортировки выбором.

17.  Сортировка обменами. Дана последовательность чисел a1, a2, ..., аn. Требуется переставить числа в порядке возрастания. Для этого сравниваются два соседних числа аi и аi+1. Если ai > ai+1, то делается перестановка. Так продолжается до тех пор, пока все элементы не будут расположены в порядке воз­растания. Составить алгоритм сортировки, подсчитывая при этом количество перестановок.

18.  Сортировка вставками. Дана последовательность чисел a1, a2, ..., аn. Требуется переставить числа в порядке возраста­ния. Делается это следующим образом. Пусть a1, a2, ..., аi — упорядоченная последовательность, т.е. a1  a2  ...  аi. Берет­ся следующее число ai+1 и вставляется в последовательность так, чтобы новая последовательность была также неубываю­щей. Процесс производится до тех пор, пока все элементы от i+l до n не будут перебраны.

19.  Сортировка Шелла. Дан массив n действительных чисел. Требуется упорядочить его по возрастанию. Делается это следующим образом: сравниваются два соседних элемента аi и аi+1. Если аi  аi+1, то продвигаются на один элемент вперед. Если аi > аi+1, то производится перестановка и сдвигаются на один элемент назад. Составить алгоритм этой сортировки.

20.  Пусть даны неубывающая последовательность действитель­ных чисел  а и действительные числа a1  a2  ...  аn и b1  b2  ...  bm. Требуется указать те места, на которые нужно вставлять элементы последовательности b1, b2, ..., bm в первую последо­вательность так, чтобы новая последовательность оставалась неубывающей.

21.  Даны дроби i, qi — натуральные). Составить программу, которая приводит эти дроби к общему знаменате­лю и упорядочивает их в порядке возрастания.

22.  Алгоритм фон Неймана. Упорядочить массив a1, a2, ..., аn по неубыванию с помощью алгоритма сортировки слияниями: - каждая пара соседних элементов сливается в одну груп­пу из двух элементов (последняя группа может состоять из одного элемента); - каждая пара соседних двухэлементных групп сливается в одну четырехэлементную группу и т.д. При каждом слиянии новая укрупненная группа упорядочи­вается.

Двумерные массивы

А

Сформировать квадратную матрицу порядка n по заданному образцу:

1.        

(n – четное)

2.        

3.        

4.        

5.        

6.        

7.        

8.        

9.        

10.     

11.     

12.     

13.       Построить квадратную матрицу порядка 2n:

 

 

n

 

 

 

n

14.       Дано действительное число x. Получить квадратную матрицу порядка n+1:

15.       Даны действительные числа a1, a2, ..., аn. Получить квадратную матрицу порядка n:

16.       Получить матрицу:

17.       Получить матрицу:

18.       Составить программу, которая заполняет квадратную матрицу порядка n натуральными числами 1, 2, 3, …, n2, записывая их в нее по “спирали”. Например, для n = 5 получим следующую матрицу:

19.       Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n  n по часовой стрелке, начиная с блока в левом верхнем углу.

20.       Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n  n крест накрест.

21.       Дан линейный массив x1, x2, …, xn. Получить действительную квадратную матрицу порядка n:

22.       Дан линейный массив x1, x2, … xn-1, xn. Получить действительную квадратную матрицу порядка n:

23.       Получить квадратную матрицу порядка n:

24.       Получить квадратную матрицу порядка n:

Б

1.     Магическим квадратом порядка n называется квадратная матрица размера n  n, составленная из чисел 1, 2, …, n2 так, что суммы по каждому столбцу, каждой строке и каждой из двух больших диагоналей равны между собой. Построить такой квадрат. Пример магического квадрата порядка 3:

2.     Вычислить сумму и число положительных элементов матри­цы A [N, N], находящихся над главной диагональю.

3.     Дана вещественная матрица A размера n  m. Определить количество “особых” элементов массива A, считая его эле­мент особым, если он больше суммы остальных элементов столбца.

4.     Задана квадратная матрица. Переставить строку с макси­мальным элементом на главной диагонали со строкой с задан­ным номером m.

5.     Дана матрица B [N, М]. Найти в каждой строке матрицы мак­симальный и минимальный элементы и поменять их с пер­вым и последним элементом строки соответственно.

6.     Дана целая квадратная матрица n-го порядка. Определить, является ли она магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах одинаковы.

7.     Элемент матрицы назовем седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной целой матрицы размером n  m напечатать индексы всех ее седловых точек.

8.     Дана вещественная матрица размером n  m. Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент (или один из них) оказался в верхнем левом углу.

9.     Определить, является ли заданная целая квадратная матрица n-го порядка симметричной (относительно главной диагона­ли).

10.  Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элемен­том главной диагонали.

11.  Упорядочить по возрастанию элементы каждой строки матри­цы размером n  m.

12.  Задана матрица размером n  m. Найти максимальный по мо­дулю элемент матрицы. Переставить строки и столбцы матри­цы таким образом, чтобы максимальный по модулю элемент был расположен на пересечении k-й строки и k-го столбца.

13.  Дана квадратная матрица A [N, N]. Записать на место отрица­тельных элементов матрицы нули, а на место положитель­ных — единицы. Вывести на печать нижнюю треугольную матрицу в общепринятом виде.

14.  Дана действительная матрица размером n  m, все элементы которой различны. В каждой строке выбирается элемент с на­именьшим значением, затем среди этих чисел выбирается наибольшее. Указать индексы элемента с найденным значе­нием.

15.  Дана действительная квадратная матрица порядка N (N — не­четное), все элементы которой различны. Найти наибольший элемент среди стоящих на главной и побочной диагоналях и поменять его местами с элементом, стоящим на пересечении этих диагоналей.

16.  Для заданной квадратной матрицы сформировать одномер­ный массив из ее диагональных элементов. Найти след матри­цы, суммируя элементы одномерного массива. Преобразовать исходную матрицу по правилу: четные строки разделить на полученное значение, нечетные оставить без изменения.

17.  Задана квадратная матрица. Получить транспонированную матрицу, т.е. матрицу, где столбцы и строки меняются места­ми.

18.  Квадратная матрица, симметричная относительно главной диагонали, задана верхним треугольником в виде одномерно­го массива. Восстановить исходную матрицу и напечатать по строкам.

19.  Задана матрица порядка n и число k. Разделить элементы k-ой строки на диагональный элемент, расположенный в этой строке.

20.  Для целочисленной квадратной матрицы найти число элемен­тов, кратных k, и наибольший из полученных результатов.

21.  Найти наибольший и наименьший элементы прямоугольной матрицы и поменять их местами.

22.  Дана прямоугольная матрица. Найти строку с наибольшей и наименьшей суммой элементов. Вывести на печать найден­ные строки и суммы их элементов.

23.  В данной действительной квадратной матрице порядка n найти сумму элементов строки, в которой расположен эле­мент с наименьшим значением. Предполагается, что такой элемент единственный.

24.  В данной действительной квадратной матрице порядка n найти наибольший по модулю элемент. Получить квадратную матрицу порядка n-1 путем отбрасывания из исходной мат­рицы строки и столбца, на пересечении которых расположен элемент с найденным значением.

25.  Дана действительная квадратная матрица порядка n. Преоб­разовать матрицу по правилу: строку с номером n сделать столбцом с номером n, а столбец с номером n  строкой с но­мером n.

26.  Пусть дана действительная матрица размером n  m. Требует­ся преобразовать матрицу: поэлементно вычесть последнюю строку из всех строк, кроме последней.

27.  Определить номера тех строк целочисленной матрицы A [N, К], которые совпадают с массивом D [K]. Если таких строк нет, выдать соответствующее сообщение.

28.  Определить наименьший элемент каждой четной строки мат­рицы А [М, N].

29.  Расположить столбцы матрицы D [M, N] в порядке возраста­ния элементов k-ой строки (1  k  М).

30.  Определить номера строк матрицы R [M, N], хотя бы один эле­мент которых равен с, и элементы этих строк умножить на d.

31.  Матрица A [N, М] (М кратно 4) разделена по вертикали на две половины. Определить сумму элементов каждого столбца левой половины и сумму элементов каждого четного столбца правой половины матрицы А.

32.  Дана квадратная целочисленная матрица порядка n. Сформи­ровать результирующий одномерный массив, элементами ко­торого являются строчные суммы тех строк, которые начина­ются с k идущих подряд положительных чисел.

33.  “Тестирование коллектива”. Пусть целочисленная матрица размером n  m содержит информацию о студентах некоторой группы из n человек. В первом столбце проставлена масса (кг), во втором — рост (см), в третьем — успеваемость (сред­ний балл) и т.д. (используйте свои дополнительные показате­ли). Студент называется среднестатистическим по k-му параметру (уникальным по k-му параметру), если на нем до­стигается минимум (максимум) модуля разности среднего арифметического чисел из k-го столбца и значения k-го пара­метра этого студента. Студент называется самым уникальным (самым средним), если он уникален (является среднестатис­тическим) по самому большому количеству параметров. По данной матрице определить самых уникальных студентов и самых средних.

Лабораторная работа № 9. Подпрограммы

Теоретические сведения

 

Подпрограмма — программа, реализующая вспомогательный алгоритм. Основная программа — программа, реализующая основной алгоритм решения задачи и со­держащая в себе обращения к подпрограммам. В VBA существуют два типа подпрограмм: подпрограммы-функ­ции и подпрограммы-процедуры. Отличие функции от процедуры заключается  в том, что результатом исполнения операторов, образующих тело функции, всегда является некоторое единственное значение, поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами.

Структурным элементом программы, написанной на языке VBA, является модуль – совокупность объявлений, процедур и функций, объединенных в единое целое. Каждый модуль состоит из области описания и одной или нескольких процедур и функций. Входящие в модуль процедуры и функции объединены общей областью описания. В ней описываются данные и объекты, которые являются общепринятыми для подпрограмм модуля. Иерархия указанных объектов такова:

         модуль;

         область описания;

         подпрограмма;

         код;

         оператор.

Подпрограмма-процедура имеет следующий синтаксис:

[Private | Public] [StaticSub <имя процедуры> ([<список аргументов>])

         [<Инструкции>]

         [Exit Sub]

         [<Инструкции>]

End Sub

Public – указывает, что процедура Sub доступна во всех других процедурах во всех модулях;

Private – указывает, что процедура Sub доступна для других процедур только того  модуля, в котором она описана;

Static – указывает, что локальные переменные процедуры Sub сохраняются в промежутках времени между вызовами этой процедуры;

SubEnd Sub – служебные слова VBA;

<имя процедуры> – имя процедуры, удовлетворяющее стандартным правилам именования;

<список аргументов> – список переменных, представляющих аргументы, которые передаются в процедуру Sub при её вызове. Имена переменных разделяются запятой;

<Инструкции> – любой набор команд VBA;

Exit Sub – инструкция, выполнение которой приводит к выходу из процедуры.

Синтаксис элемента <список аргументов>:

[Optional] [ByVal | ByRef] [ParamArray] <Имя переменной> [As <Тип>] [ = <По умолчанию>]

Optional – ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержатся в списке аргументов, так же должны быть необязательными и описаны с помощью ключевого слова Optional. Все аргументы, описанные как Optional, должны иметь тип Variant. Не допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray;

ByVal – ключевое слово, указывающее, что аргумент передается по значению;

ByRef – ключевое слово, указывающее, что аргумент передается по ссылке. Описание ByRef используется в VBA по умолчанию;

ParamArray – ключевое слово, которое может использоваться только в качестве последнего элемента в списке <список аргументов> для указания, что конечным элементом является описанный как Optional массив значений типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов, оно не может быть использовано со словами ByValByRef или Optional;

<Имя переменной>  имя переменной, удовлетворяющее стандартным правилам именования переменных;

<Тип> – тип данных аргумента, переданного в процедуру;

<По умолчанию> – любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть Nothing.

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

Обращение к процедуре — отдельный оператор.

Вызов процедуры из другой процедуры можно произвести несколькими способами.

Первый способ:

<Имя процедуры> <Список фактических параметров>

<Имя процедуры>  имя вызываемой процедуры;

<Список фактических параметров> – список аргументов, передаваемых процедуре; он должен соответствовать списку, заданному в процедуре, по количеству и типу.

Второй способ:

Call <Имя процедуры> (<Список фактических параметров>)

Call  служебное слово VBA;

<Имя процедуры>  имя вызываемой процедуры;

<Список фактических параметров> – список аргументов, передаваемых процедуре; он должен соответствовать списку, заданному в процедуре, по количеству и типу.

Заметим, что при втором способе вызова процедуры в отличие от первого список фактических параметров должен быть заключен в круглые скобки; в качестве разделителя в списке используется запятая.

VBA позволяет вводить фактические параметры через имена аргументов в любом порядке и опускать необязательные (Optional). При этом после имени аргумента ставится двоеточие и знак равенства, после которого помещается значение аргумента.

Приведенный ниже пример показывает основные способы обращения к процедуре.

Option Explicit

Dim c As Double

'c - глобальная переменная

Function F(ByVal x As Integer) As Integer

'Функция, возводящая аргумент в квадрат

F = x ^ 2

End Function

Sub Assistant(ByVal a As Integer, ByVal b As Integer)

'Процедура, находящая сумму двух чисел и

'выводящая результат в диалоговом окне

c = a + b

MsgBox "Сумма: " & c, , "Результат"

End Sub

Sub Main()

'Главная процедура, вызывающая подпрограммы

Dim x As Double, y As Double

'Вызов процедуры с конкретными числами как фактическими параметрами

Assistant 1, 3

'Первоначальное присвоение переменным значений,

'с последующим вызовом процедуры

x = 1

y = 1

Assistant x, y + 2

'Использование функции как фактического параметра

x = 1

y = 3

Assistant F(x), y

'Вызов процедуры с указанием фактических параметров по имени

Assistant b:=3, a:=1

'Вызов процедуры с использованием ключевого слова Call

Call Assistant(x, y)

End Sub

Подпрограмма-функция имеет следующий синтаксис:

[Private | Public] [Static] Function <имя функции> [(<список аргументов>)]

         [<Инструкции>]

         [Exit Function]

         [<Инструкции>]

End Sub

Синтаксис инструкции Function содержит те же элементы, что и Sub. Инструкция Exit Function приводит к выходу из функции.

Тип функции может быть только простым типом. Блок содержит локальные для функции описания и раздел операторов. Для возврата значения из функции следует присвоить значение имени функции.

Обращение к функции является операндом в вы­ражении. Подпрограмма-функция вызывается в выражении по своему имени, за которым следует вписок аргументов в скобках.

При обращении к подпрограмме происходит передача ей аргументов по ссылке (если формальный параметр является параметром-переменной, описан как ByRef) или по значению (является параметром-значением, описан как ByVal).

Для того, чтобы понять, в каких случаях использовать тот или иной тип передачи аргументов, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме.

Если параметр определен как параметр-значение (с помощью ключевого слова ByVal), то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Важно учесть, что даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, все равно подпрограмме будет передана лишь копия переменной (константы). Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей подпрограммой, так как в этом случае изменяется копия фактического параметра.

Если параметр определен как параметр-переменная (по умолчанию или с помощью ключевого слова ByRef), то при вызове подпрограммы передается сама переменная, а не ее копия. Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей подпрограмме.

Если в качестве фактического параметра используется константа, транслятор блокирует любые присваивания константе нового значения в теле подпрограммы.

Представленный ниже пример поясняет изложенное. В программе осуществляется ввод целых чисел, их передача процедуре Удвоение. Один из параметров параметр-переменная, другой – как параметр-значение. Значение параметров до и после вызова процедуры, а так же результат их удвоения выводятся на экран.

Option Explicit

Sub Удвоение(ByRef c As Integer, ByVal d As Integer)

c = c + c

d = d + d

MsgBox "Удвоенные: " & c & ", " & d

End Sub

Sub Основная()

Dim a As Integer, b  As Integer

a = Val(InputBox("Введите а", "Ввод", 5))

b = Val(InputBox("Введите b", "Ввод", 7))

MsgBox "Исходные: " & a & ", " & b

Удвоение a, b

MsgBox "Результат: " & a & ", " & b

End Sub

В результате прогона программы при сохранении вводимых значений переменных a и b по умолчанию будет выведено:

Как видно из примера, удвоение второго формального параметра в процедуре Удвоение не вызвало изменения фактической переменной b, так как этот параметр описан в заголовке процедуры как параметр-значение.

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

С другой стороны, описание всех формальных параметров как параметров-переменных нежелательно по двум причинам. Во-первых, это исключает возможность вызова подпрограммы с фактическими параметрами в виде выражений, что делает программу менее компактной. Во-вторых, и главных, в подпрограмме возможно случайное использование формального параметра, например, для временного хранения промежуточного результата, т.е. всегда существует опасность непреднамеренно испортить фактическую переменную. Вот почему параметрами-переменными следует объявлять только те, через которые подпрограмма в действительности передает результаты вызывающей программе. Чем меньше параметров объявлено параметрами-переменными и чем меньше в подпрограмме используется глобальных переменных, тем проще программа в понимании и отладке. По этой же причине не рекомендуется использовать параметры-переменные в заголовке функции: если результатом работы функции не может быть единственное значение, то логичнее использовать процедуру или нужным образом декомпозировать алгоритм на несколько подпрограмм.

Демонстрационные примеры:

1. Вычислить разность двух простых дробей:    (a, b, с, d — натуральные числа). Результат получить в виде простой несократимой дроби.

Следует вычислить числитель и знаменатель по правилам вычитания дробей, и сократить их на наибольший общий делитель (НОД). Вычисление НОД двух чисел оформим в виде подпрограммы, используя известный в математике ал­горитм Евклида.

Составим два варианта программы решения этой задачи: с подпрограммой-функцией и подпрограммой-процедурой.

Решение 1

Option Explicit

Function НОД(ByVal M As Integer, ByVal N As Integer) As Integer

'Вычисление НОД двух натуральных чисел по алгоритму Евклида

Do While M <> N

If M > N Then

M = M - N

Else

N = N - M

End If

НОД = M

Loop

End Function

Sub Способ1 ( )

Dim A As Integer, B As Integer, C As Integer, D As Integer, E As Integer, F As Integer

A = Val(InputBox("Ведите числитель первой дроби", "Ввод данных"))

B = Val(InputBox("Ведите знаменатель первой дроби", "Ввод данных"))

C = Val(InputBox("Ведите числитель второй дроби", "Ввод данных"))

D = Val(InputBox("Ведите знаменатель второй дроби", "Ввод данных"))

E = A * D - B * C                                  'Вычисление числителя

F = B * D                                                               'Вычисление знаменателя

If E = 0 Then

MsgBox "Разность дробей" & E, , "Результат"

Else

E = E \ НОД(Abs(E), F)                       'Сокращение дроби

F = F \ НОД(Abs(E), F)

MsgBox "Разность дробей: " & E & "/" & F, , "Результат"

End If

End Sub

Решение 2

Option Explicit

Sub НОД(ByVal M As Integer, ByVal N As Integer, K As Integer)

'Вычисление НОД двух натуральных чисел по алгоритму Евклида

Do While M <> N

If M > N Then

M = M - N

Else

N = N - M

End If

K = M

Loop

End Sub

Sub Способ2 ( )

Dim A As Integer, B As Integer, C As Integer, D As Integer, E As Integer, F As Integer, K As Integer, L As Integer

A = Val(InputBox("Ведите числитель первой дроби", "Ввод данных"))

B = Val(InputBox("Ведите знаменатель первой дроби", "Ввод данных"))

C = Val(InputBox("Ведите числитель второй дроби", "Ввод данных"))

D = Val(InputBox("Ведите знаменатель второй дроби", "Ввод данных"))

E = A * D - B * C                                  'Вычисление числителя

F = B * D                                                               'Вычисление знаменателя

If E = 0 Then

MsgBox "Разность дробей" & E, , "Результат"

Else

НОД Abs(E), F, L                 'Обращение к процедуре

E = E \ L                                 'Сокращение дроби

F = F \ L

MsgBox "Разность дробей: " & E & "/" & F, , "Результат"

End If

End Sub

2. Составить рекурсивную подпрограмму-функцию вычисления факториала целого положительного числа.

Рекурсивной называется подпрограмма, которая в своем описании содержит обращение к самой себе. Функцию N! рекурсивно можно определить, исходя из следующей фор­мулы:

Описание функции на VBA:

Function Factorial(N As Integer) As Long

If N = 0 Then

Factorial = 1

Else

Factorial = Factorial(N - 1) * N

End If

End Function

З. В целочисленной матрице размером 1010 произвести сортировку чисел в строках по возрастанию значений. Первоначально заполнить матрицу целыми случайными числами в диапазоне от 0 до 100.

Для решения задачи составим процедуру Sortirovka сортировки одномерного массива по убыванию значений. В основной програм­ме используем эту процедуру для сортировки каждой строки матрицы.

Option Explicit

Sub Sortirovka(X() As Integer, s As String)

Dim i As Integer, j As Integer, Z As Integer, s1 As String

Const N As Integer = 10

ReDim Preserve X(N) As Integer

For i = 1 To N

For j = i + 1 To N

If X(i) < X(j) Then

Z = X(j)

X(j) = X(i)

X(i) = Z

End If

Next

s = s & X(i) & "  "

Next

End Sub

Sub SortMatr()

Dim A() As Integer, B() As Integer

Dim m As Integer, k As Integer, t As Integer

Dim str As String, sort_str As String, s1 As String

Const N = 10

ReDim A(N, N) As Integer

ReDim B(N) As Integer

str = ""

sort_str = ""

'Заполнение матрицы случайными числами и

'формирование строки с элементами матрицы

For k = 1 To N

For m = 1 To N

A(k, m) = Int(100 * Rnd + 1)

str = str & A(k, m) & "  "

B(m) = A(k, m)

Next m

str = str & Chr(13)

Sortirovka X:=B, s:=sort_str    'Обращение к процедуре

sort_str = sort_str & Chr(13)   'Формирование строки с результатом

Next k

MsgBox "Исходный массив" & Chr(13) & str & Chr(13) & "Отсортированный массив" &  _

Chr(13) & sort_str

End Sub