h c i j h ] j z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 ·...

81
ɀɭɤ ȿɥɟɧɚ Ȼɨɪɢɫɨɜɧɚ Ʉɭɪɫ ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ ɧɚ VB.NET ɜ ɫɨɨɬɜɟɬɫɬɜɢɢ ɫ ɧɨɜɨɣ ɩɪɨɝɪɚɦɦɨɣ Ɋɚɡɞɟɥ 6 ɑȺɋɌɖ I. ɌȺȻɅɂɑɇɕȿ ȼȿɅɂɑɂɇɕ ɂ ȺɅȽɈɊɂɌɆɕ ɂɏ ɈȻɊȺȻɈɌɄɂ http://algorythm.uastorage.com/algoritmyi-na-vb-net/ 2017 ɝɨɞ

Upload: others

Post on 03-Jun-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

ɀɭɤ�ȿɥɟɧɚ�Ȼɨɪɢɫɨɜɧɚ

ɄɄɭɭɪɪɫɫ ɩɩɪɪɨɨɝɝɪɪɚɚɦɦɦɦɢɢɪɪɨɨɜɜɚɚɧɧɢɢɹɹ ɧɧɚɚ VVBB..NNEETT ɜɜ ɫɫɨɨɨɨɬɬɜɜɟɟɬɬɫɫɬɬɜɜɢɢɢɢ ɫɫ ɧɧɨɨɜɜɨɨɣɣ ɩɩɪɪɨɨɝɝɪɪɚɚɦɦɦɦɨɨɣɣ

Ɋɚɡɞɟɥ 6

ɑȺɋɌɖ I. ɌȺȻɅɂɑɇɕȿ�ȼȿɅɂɑɂɇɕ�ɂ�ȺɅȽɈɊɂɌɆɕ�ɂɏ ɈȻɊȺȻɈɌɄɂ

http://algorythm.uastorage.com/algoritmyi-na-vb-net/

22001177 ɝɝɨɨɞɞ

Page 2: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 1

ɈȽɅȺȼɅȿɇɂȿ ɑȺɋɌɖ I. ɈȾɇɈɆȿɊɇɕȿ�ɆȺɋɋɂȼɕ ........................................................................................................................3 6.1.1 ТАБЛИЧНЫЕ ВЕЛИЧИНЫ - МАССИВЫ........................................................................................................3

ПОНЯТИЕ ТАБЛИЧНОЙ ВЕЛИЧИНЫ (МАССИВА) ................................................................................................................3 ОБЪЯВЛЕНИЕ ОДНОМЕРНОГО МАССИВА ...........................................................................................................5

I. САМЫЙ ПРОСТОЙ СПОСОБ ОПИСАНИЯ МАССИВА ..........................................................................................................5 II. ДИНАМИЧЕСКОЕ СОЗДАНИЕ МАССИВА ........................................................................................................................6 III. ОБЪЯВЛЕНИЕ МАССИВА С ИНИЦИАЛИЗАЦИЕЙ ............................................................................................................6 ОСОБЕННОСТИ ИНДЕКСАЦИИ В VB EXPRESS EDITION......................................................................................................6

ЗАПОЛНЕНИЕ ДАННЫМИ ОДНОМЕРНОГО МАССИВА .....................................................................................7 ЗАДАНИЕ ЭЛЕМЕНТАМ ЗНАЧЕНИЙ ПО ФОРМУЛЕ...............................................................................................................7 ГЕНЕРАТОР СЛУЧАЙНЫХ ЧИСЕЛ И ЗАПОЛНЕНИЕ ОДНОМЕРНОГО МАССИВА ......................................................................8 ОТЛАДКА ЗАПОЛНЕНИЯ МАССИВА...................................................................................................................................9 ТРАССИРОВКА ЗАПОЛНЕНИЯ МАССИВА ...........................................................................................................................9

ВВОД И ВЫВОД ЗНАЧЕНИЙ ЭЛЕМЕНТОВ ОДНОМЕРНОГО МАССИВА ......................................................10 ВВОД ЗНАЧЕНИЙ ЭЛЕМЕНТОВ МАССИВА ИЗ ОКНА ВВОДА...............................................................................................10 ВЫВОД ЗНАЧЕНИЙ ЭЛЕМЕНТОВ МАССИВА В ОКНО ВЫВОДА ...........................................................................................10

Компонент текстовое поле TextBox...................................................................................................................... 11 Свойства текстового поля TextBox....................................................................................................................... 11

ВВОД ЗНАЧЕНИЙ ЭЛЕМЕНТОВ МАССИВА ИЗ TEXTBOX ...................................................................................................11 ВЫВОД ЗНАЧЕНИЙ ЭЛЕМЕНТОВ МАССИВА В TEXTBOX...................................................................................................12

ЗАДАЧА 1. ВВОД, ОБРАБОТКА ЧИСЛОВОГО МАССИВА И ВЫВОД ЕГО В ТЕКСТОВОЕ ПОЛЕ .............12 ПОСТАНОВКА ЗАДАЧИ...................................................................................................................................................12 ПРОГРАММНЫЙ КОД......................................................................................................................................................12 ВЫПОЛНЕНИЕ ...............................................................................................................................................................13 ДОПОЛНИТЕЛЬНОЕ ЗАДАНИЕ .........................................................................................................................................13

ИСПОЛЬЗОВАНИЕ КОМПОНЕНТА LISTBOX ПРИ РАБОТЕ С МАССИВАМИ..............................................13 КОМПОНЕНТ LISTBOX (СПИСОК) ..................................................................................................................................13

Основные свойства списка ListBox:....................................................................................................................... 14 ЗАДАЧА 1. ВОЗВЕДЕНИЕ ЗНАЧЕНИЙ МАССИВА В КВАДРАТ .............................................................................................15 ДОМАШНЕЕ ЗАДАНИЕ....................................................................................................................................................16

Работаем с комп’ютером. Выполните задания.................................................................................................... 16 II. Задание 2. ........................................................................................................................................................... 16 Проект Друзья........................................................................................................................................................ 17 Выполните задания ................................................................................................................................................ 18

САМОЕ ВАЖНОЕ В ЭТОМ ПУНКТЕ...................................................................................................................................19 РАЗГАДАЙТЕ РЕБУСЫ ....................................................................................................................................................20 ПЕРЕЙДЕМ К ВЫПОЛНЕНИЮ ПРОЕКТОВ .........................................................................................................................21

Проект Монета...................................................................................................................................................... 21 6.2 ОБРАБОТКА МАССИВОВ ....................................................................................................................................22

ОСНОВНЫЕ ТИПЫ ЗАДАЧ ОБРАБОТКИ ОДНОМЕРНЫХ МАССИВОВ ....................................................................................22 ВЫЧИСЛЕНИЕ СУММЫ (ИЛИ ПРОИЗВЕДЕНИЯ) ЗНАЧЕНИЙ И КОЛИЧЕСТВА ЭЛЕМЕНТОВ МАССИВА, СОВПАДАЮЩИХ С ЗАДАННЫМ....................................................................................................................................................................22

Вычисление произведения элементов массива....................................................................................................... 22 Вычисление суммы значений элементов массива .................................................................................................. 23 Подсчет повторения заданного числа в массиве................................................................................................... 23

ПОИСК В ОДНОМЕРНОМ МАССИВЕ .....................................................................................................................24 НАИБОЛЬШИЙ И НАИМЕНЬШИЙ ЭЛЕМЕНТЫ МАССИВА ...................................................................................................25

Поиск максимального значения .............................................................................................................................. 25 ПОИСК МАКСИМАЛЬНОГО И МИНИМАЛЬНОГО ЗНАЧЕНИЯ ..............................................................................................26

Домашнее задание .................................................................................................................................................. 26 РАБОТАЕМ С КОМПЬЮТЕРОМ. ЗАДАЧА 6........................................................................................................................27

Выполните задания ................................................................................................................................................ 28 САМОЕ ВАЖНОЕ В ЭТОМ ПУНКТЕ...................................................................................................................................29

Дайте ответы на вопросы..................................................................................................................................... 31 Разгадайте ребусы ................................................................................................................................................. 32

Page 3: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 2

ПЕРЕЙДЕМ К ВЫПОЛНЕНИЮ ПРОЕКТОВ .........................................................................................................................33 Проект SrednZnach................................................................................................................................................. 33 Проект Тайный шифр ............................................................................................................................................ 34

ИСПОЛЬЗОВАНИЕ КОМПОНЕНТА DATAGRIDVIEW ........................................................................................35 ЭЛЕМЕНТ УПРАВЛЕНИЯ DATAGRIDVIEW .......................................................................................................................35 ВЫВОД И ВЫВОД ДАННЫХ .............................................................................................................................................36 ОБРАБОТКА ОДНОМЕРНОГО МАССИВА С ИСПОЛЬЗОВАНИЕМ ГРИДА ...............................................................................37

Задача 1. Вывод массива в грид ............................................................................................................................. 37 РАБОТАЕМ С КОМПЬЮТЕРОМ.........................................................................................................................................38

Проект Перестановка............................................................................................................................................ 38 Самое важное в этом пункте................................................................................................................................ 39 Вопросы и задания .................................................................................................................................................. 39

ПРАКТИЧЕСКАЯ РАБОТА 12 ...........................................................................................................................................40 Разгадайте ребусы ................................................................................................................................................. 42

6.4 СОРТИРОВКА. ПОИСК В УПОРЯДОЧЕННОМ МАССИВЕ ........................................................................... 43 АЛГОРИТМЫ УПОРЯДОЧЕНИЯ ЭЛЕМЕНТОВ МАССИВА ....................................................................................................43

Сортировка обменом (метод пузырька)................................................................................................................ 43 Сортировка выбором (метод минимальных элементов) ...................................................................................... 44

ЗАДАЧИ ..........................................................................................................................................................................45 Сортировка методом выбора................................................................................................................................ 45 Проект Sort............................................................................................................................................................. 46 Задача 2. Проект Sort2........................................................................................................................................... 47

СОРТИРОВКА ЭЛЕМЕНТОВ СТРОКОВОГО (ТЕКСТОВОГО) МАССИВА .................................................................................49 Сортировка текстовых массивов Проект SortMy................................................................................................ 49

ПОИСК ЗНАЧЕНИЯ В ОТСОРТИРОВАННОМ МАССИВЕ.......................................................................................................50 Проект BinarySearch .............................................................................................................................................. 50 Поиск значения в текстовом массиве.................................................................................................................... 52

ЗАПУСТИТЕ ПРОЕКТ НА ВЫПОЛНЕНИЕ. ..........................................................................................................................53 ДЛЯ ТЕХ, КТО ХОЧЕТ ЗНАТЬ БОЛЬШЕ .............................................................................................................................53

Сортировка подсчётом.......................................................................................................................................... 53 Еще сортировки...................................................................................................................................................... 54 Классификация сортировок ................................................................................................................................... 54

РАБОТАЕМ С КОМПЬЮТЕРОМ.........................................................................................................................................55 Самое важное в этом пункте................................................................................................................................ 55 Дайте ответы на вопросы..................................................................................................................................... 55 Разгадайте ребусы ................................................................................................................................................. 56

6.5 ФУНКЦИИ. ПРОЦЕДУРЫ .................................................................................................................................... 57 ПОДПРОГРАММЫ ..........................................................................................................................................................57 СТАНДАРТНЫЕ И НЕСТАНДАРТНЫЕ ФУНКЦИИ ...............................................................................................................57

Создание функций пользователя ............................................................................................................................ 58 Создание функций пользователя. Задача 1............................................................................................................ 59 Задача 2. Гипотенуза ............................................................................................................................................. 60 Задача 3. Вычислить значение функций у = х3 - х2 + 3 и у = х4 - 2х2 + 5............................................................... 61 Задача 4. Вычисление n! ......................................................................................................................................... 61 Итоги. Вопросы и задания ..................................................................................................................................... 62 Работаем с компьютером ..................................................................................................................................... 64

ПРОЦЕДУРЫ ПОЛЬЗОВАТЕЛЯ .........................................................................................................................................64 Задача 1. Проект Гипотенуза................................................................................................................................ 66 Процедурный стиль программирования................................................................................................................. 67 Процедуры как средство реализации принципа декомпозиции алгоритмов ......................................................... 67 Передача массивов в подпрограммы...................................................................................................................... 67 Стандартные функции LBOUND() и UBOUND().................................................................................................. 68 Задача 2. Проект Растворы .................................................................................................................................. 68 Задача 3. Процедура получения дней месяца ......................................................................................................... 70 Дополнительные пояснения.................................................................................................................................... 71

ПОНЯТИЕ О СТРУКТУРНОМ ПРОГРАММИРОВАНИИ .........................................................................................................71 Итоги. Вопросы и задания ..................................................................................................................................... 72

РАБОТАЕМ С КОМПЬЮТЕРОМ.........................................................................................................................................74 Проект Sub_Sort ..................................................................................................................................................... 74 Разгадайте ребусы ................................................................................................................................................. 76

ВЫПОЛНИТЕ ПРОЕКТЫ ..................................................................................................................................................77 Проект Фамилия_Меры ......................................................................................................................................... 77

Page 4: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 3

ɑȺɋɌɖ I. Ɉɞɧɨɦɟɪɧɵɟ�ɦɚɫɫɢɜɵ

6.1.1 Табличные величины - МАССИВЫ ȼɨɩɪɨɫɵ 1. Что определяет тип переменной? Какие типы переменных вы знаете? 2. Где случаются упорядоченные наборы данных? В чем удобство их использования? 3. Каков общий вид и как выполняется команда цикла со счетчиком в языке программирования VB.Net?

ɉɨɧɹɬɢɟ�ɬɚɛɥɢɱɧɨɣ�ɜɟɥɢɱɢɧɵ (ɦɚɫɫɢɜɚ) Cуществует много задач, в которых требуется обрабатывать значения достаточно большого

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

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

Если использовать 100 переменных типа Single с произвольными именами, например m1, m2, m3, m4, m5, m6, …, m100, то команда нахождения суммы их значений будет содержать в правой части 100 слагаемых или нужно включить в текст программы такие 100 команд:

sum = m1 sum = sum + m2 sum = sum + m3 ….. sum = sum + m100 Вышеприведенное решение делает текст программы громоздким и неудобным, несмотря на

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

пойти таким путем: рассматривать все эти переменные как элементы некоторого упорядоченного набора переменных.

Этот набор переменных имеет имя, а имя каждой переменной набора состоит из имени на-бора и порядкового номера этой переменной в наборе.

В математике такой набор c именем A записывается как a1, a2, a3, a4, …, an Упорядоченный набор переменных одного типа, расположенный в смежных ячейках памя-

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

Каждая переменная, входящая в массив, называется его элементом. Имя элемента массива состоит из имени массива и порядкового номера этого элемента

в массиве, заключенного в круглые скобки. В качестве еще одного примера одномерного массива рассмотрим конструк-цию, состоя-

щую из множества нумерованных ящиков. Конструкция, озаглавленная именем (напр. именем Cat) – это массив. Ящики – элементы массива. Номера ящиков – это индексы элементов. Индекс записывается в скобках. Содержимое любого ящика (один из котов) – значение элемента массива. Доступ к содержимому конкретного ящика (элемента массива) осуществляется после ука-

зания имени массива (Cat) индекса массива (номера ящика), например Cat(3). В математике это имя элемента записывается как Cat3.

Чему равно количество элементов массива Cat?

CCaatt

Page 5: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 4

Индексы смежных элементов массива различаются на 1; наименьший для данного массива индекс называется его нижней границей, наибольший – верхней. Если при указании массива пи-шут Cat(7), это значит, что число 7 – верхняя граница массива Cat. С указанием нижней грани-цы пишут Сat(0…7).

У одномерного массива каждый элемент определяется одним индексом. Бывают двумерные массивы (матрицы), которые определяются парой индексов – по стро-

кам и по столбцам. Элемент Ai,j такого массива c номером по строке i и номером по столбцу j записывается как A(i,j).

Трехмерный массив (куб) имеет 3 индекса, и так далее. Начнем изучение линейных одномерных массивов.

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

Если имя этого массива m, то имена переменных - элементов этого массива будут следую-щие: m(1), m(2), m(3), …, m(100).

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

цикл, в котором последовательно обрабатываются элементы массива: сначала обрабатываем пер-вый элемент массива, затем второй, третий, ..., последний.

Для нахождения суммы значений всех 100 переменных массива, можно записать команды: sum = 0 For i = 1 to 100 sum = sum + m(i) Next i Выполнение этого фрагмента программы будет происходить так, как показано в таблице

трассировки кода. Ɉɩɟɪɚɬɨɪ Ɋɟɡɭɥɶɬɚɬ�ɜɵɩɨɥɧɟɧɢɹ

sum = 0 sum = 0 i = 1 i = 1 i <= 100? True Значение допустимо sum = sum + m(i) sum = sum + m(1) = 0 + m(1)= m(1) Next возвращает на заголовок цикла i = i + 1 i = 1 + 1 = 2 i <= 100? True Значение допустимо sum = sum + m(i) sum = sum + m(2) = m(1) + m(2) Next возвращает на заголовок цикла i = i + 1 i = 2 + 1 = 3 i <= 100? True Значение допустимо sum = sum + m(i) sum = sum + m(3) = m(1) + m(2) + m(3) Next возвращает на заголовок цикла . . . . . . . . . . . . . . . . i = i + 1 i = 99 + 1 = 100 i <= 100? True Значение допустимо

Page 6: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 5

sum = sum + m(i) sum = sum + m(100) = m(1) + m(2) + m(3) + … + m(100) Next возвращает на заголовок цикла i = i + 1 i = 100 + 1 = 101 i <= 100? False Значение недопустимо Цикл завершен

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

После этого можно вычислить искомую среднюю массу: sum = sum /100 Осталось в начале кода записать объявление массива m(100), за-

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

Порядок работы с массивом может иметь вид:

Рассмотрим, как можно объявить массив в программе.

Объявление одномерного массива Оператор описания каждого конкретного массива должен задаваться один раз в программе

до первого обращения к элементам этого массива. В языке Basic для объявления массива используется оператор Dim, в котором после имени

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

массива. Количество таких участков зависит от размерности массива. Размер каждого участка зависит от типа элементов массива.

В Microsoft Visual Basic Express Edition значение нижнего индекса диапазона индексов все-гда равно нулю.

Например, массив m из 10 элементов может быть объявлен так:

Dim M(9) As Integer

I. ɋɚɦɵɣ�ɩɪɨɫɬɨɣ�ɫɩɨɫɨɛ�ɨɩɢɫɚɧɢɹ�ɦɚɫɫɢɜɚ

Dim M ( 100 ) As Integer

ɇȺɑȺɅɈ

Ɉɛɴɹɜɢɬɶ�ɢ�ɡɚɩɨɥ-ɧɢɬɶ�ɦɚɫɫɢɜ mm(100)

ssuumm = 0

ii == 11,,110000,,11

ssuumm =ssuumm + mm((ii))

ssuumm =ssuumm/100

ȼȼɵɵɜɜɟɟɫɫɬɬɢɢ ssuumm

ɄɈɇȿɐ

Одномерный массив М целых чисел из 10 элементов

Ɇ

Ɍɢɩ ɞɚɧɧɵɯ ɷɥɟɦɟɧɬɨɜ ɦɚɫɫɢɜɚ

Ⱦɢɚɩɚɡɨɧ ɷɥɟɦɟɧɬɨɜ (ɨɬ 0 ɞɨ 100) – 101 ɹɱɟɣɤɚ

ɂɦɹ ɦɚɫɫɢɜɚ

Индекс

значение элемента

Этот элемент имеет имя М(9)

Page 7: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 6

ɉɪɢɦɟɪɵ�ɨɛɴɹɜɥɟɧɢɹ�ɦɚɫɫɢɜɨɜ�ɪɚɡɧɵɯ�ɬɢɩɨɜ: Dim Friends (100) As String ‘ ɦɚɫɫɢɜ�ɬɟɤɫɬɨɜɵɯ�ɫɬɪɨɤ Dim Marks (12) As Integer ‘ ɦɚɫɫɢɜ�ɰɟɥɵɯ�ɱɢɫɟɥ Dim Prices (50) As Single ’ ɦɚɫɫɢɜ�ɞɟɫɹɬɢɱɧɵɯ�ɱɢɫɟɥ Dim Education (90) As Boolean ‘ ɦɚɫɫɢɜ�ɥɨɝɢɱɟɫɤɢɯ�ɡɧɚɱɟɧɢɣ

II. Ⱦɢɧɚɦɢɱɟɫɤɨɟ�ɫɨɡɞɚɧɢɟ�ɦɚɫɫɢɜɚ 1. Если количество элементов массива заранее НЕ известно, то в программном коде можно вве-сти размерность массива и уже после этого объявить массив. При этом следует учитывать, что индексация в VB.Net начинается с нуля.

Dim n As Integer n = Val(TextBox1.Text) Dim A( n - 1) As Integer

Такое объявление используется, если в условии задачи сказано: создайте массив размерности n. Значение n вводится во время выполнения программы. 2. Объявление ДИНАМИЧЕСКОГО массива

‘ Ɉɛɴɹɜɥɹɟɦ�ɩɭɫɬɨɣ�ɦɚɫɫɢɜ Dim Massiv() As Single Dim n As Integer n = Val(TextBox1.Text) ‘ ɂɡɦɟɧɹɟɦ (ɡɚɞɚɟɦ) ɪɚɡɦɟɪ�ɦɚɫɫɢɜɚ If n > 0 Then ReDim Massiv(n - 1)

Если массив уже существует, то можно переопределить его размер с помощью оператора Redim.

III. Ɉɛɴɹɜɥɟɧɢɟ�ɦɚɫɫɢɜɚ�ɫ�ɢɧɢɰɢɚɥɢɡɚɰɢɟɣ Объявить массив с помощью задания значений одновременно с его заполнением и формиро-

ванием размерности можно таким оператором: Dim A() As Integer = {4, 1, 7, 9, 2, 6, 4, 2, 3, 1, 0, 7, 0, 6, 4, 2} Непосредственно в операторе Dim после типа данных и знака «=» указываем в фигурных

скобках значения элементов массива. Обратите внимание, что в этом случае объявляется «пустой» массив, без указания верхней

границы индексов. Этот оператор резервирует память под 16 элементов (с диапазоном значений индексов от 0

до 15). Одновременно происходит заполнение массива начальными значениями. Так, элемент А(3) получит значение 9, а элемент А(8) получит значение 3.

Ɉɫɨɛɟɧɧɨɫɬɢ�ɢɧɞɟɤɫɚɰɢɢ�ɜ VB Express Edition 1. Индекс элемента массива может задаваться как целым числом, так и значением выраже-

ния, которое примет целочисленное значение, например a(2*i–5), где i - переменная типа Integer. 2. Вам уже известно, что в Microsoft Visual Basic Express Edition существует ограничение на

нижний индекс элемента массива: он всегда равен нулю. Если требуется работать с массивом, имеющим нижний индекс = 1, то в этом случае можно

просто не пользоваться элементом с индексом 0. При заполнении такого массива следует иметь в виду, что хотя элемент с индексом 0 мы ис-

пользовать не будем, однако этот элемент создан. Графически массив А, содержащий 5 чисел и неиспользуемый нулевой элемент можно пред-

ставить так:

� Объявление с заполнением такого массива А(1…5) записывают так: Dim A() As Integer = {0, 2, 1, 5, 6, 3}.

3 6 5 1 2

А(0) А(1) А(2) А(3) А(4) А(5)

Не используется

Page 8: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 7

0 1 2 3 4 5 6

k = 0,10,1

Ⱥi = i2 + 1

Заполнение данными одномерного массива Присваивать значение можно только отдельным элементам массива. Пусть одномерный массив А из 7 элементов объявлен с его инициализацией: Dim A() As Integer = {4, 1, 7, 9, 2, 6, 4} Тогда после выполнения таких операторов присваивания: Ⱥ (1) = 5 Ⱥ (5) = Ⱥ (1) + 3 = 5 + 3 = 8 и с учетом того, что индексация в VB.Net начинается с нуля, элементы массива А(1), А(5)

получат такие значения: Ⱥ (1) = 5 � Ⱥ (5) = 8 Значения остальных элементов останутся неизменными, а результирующий массив А будет

содержать значения

4 5 7 9 2 8 4 Если при обращении к элементу массива указать индекс, выходящий за пределы диапазона

индексов, то в ходе выполнения программы получим ошибку и соответствующее сообщение.

Ɂɚɞɚɧɢɟ�ɷɥɟɦɟɧɬɚɦ�ɡɧɚɱɟɧɢɣ�ɩɨ�ɮɨɪɦɭɥɟ Заполнять массив можно, используя некоторую закономерность, например по формуле Ai = i2+1

Dim A(10) As Integer Dim i As Integer For i = 0 To 10 A(i) = i^2+1 Next С помощью формулы, в которой для вычислений значения элемен-та используется индекс этого элемента, массив заполняется быст-ро.

Рассмотрим заполнение массива из 10 элементов по такой закономерности: Аі = 2∙і – 1

Dim A(10) As Integer Dim i As Integer For i = 1 To 10 A(i) = 2*i – 1 ListBox1.Items.Add(A(i)) Next

Обратите внимание: элемент с индексом 0 мы не используем Какую последовательность элементов массива получим? Выполним трассировку алгоритма.

Page 9: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 8

Ƚɟɧɟɪɚɬɨɪ�ɫɥɭɱɚɣɧɵɯ�ɱɢɫɟɥ�ɢ�ɡɚɩɨɥɧɟɧɢɟ�ɨɞɧɨɦɟɪɧɨɝɨ�ɦɚɫɫɢɜɚ Во многих программах нужно генерировать случайные числа. Особенно это касается компьютерных игр, в которых много случайных событий, похожих на

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

цифр, случайная, и это подогревает интерес к игре. Случайные числа часто используются в программировании компьютерных игр. На языке Visual Basic.NET для генерации случайных чисел используют функцию Rnd( ). При

запуске программы функция Rnd( ) дает псевдослучайную (каждый раз повторяющуюся) после-довательность чисел из диапазона [0, 1].

Для получения числовой последовательности случайных чисел из промежутка [0; 100] следует умножить полученное с помощью функции Rnd( ) число на 100 и выделить из полученного числа целую часть: Int(Rnd( )* 100).

Функция Int( ) возвращает целую часть действительного числа. Для получения случайных действительных чисел из произвольного интервала [A;B] можно

воспользоваться формулой: (B – A)*Rnd( ) + A. Для получения случайного целого числа из диапазона (-20; +20) пишут так: 40*Int(Rnd( )) - 20.

Чтобы сгенерировать абсолютно случайное (а не псевдослучайное) число, перед оператором с функцией RND() помещают в код программы оператор Randomize( ) , который для генерации последовательности случайных чисел использует значение, возвращаемое системным таймером.

Рассмотрим проект, который иллюстрирует применение генератора случайных чисел: он бу-дет имитировать бросание шестигранных костей.

На форме проекта размещена кнопка. Значение атрибута Text этой кнопки – Бросить кости. В обработчик события щелчка кнопки добавлен следующий код: Dim myRandom As Integer ‘ɡɚɩɭɫɤɚɟɦ�ɝɟɧɟɪɚɬɨɪ�ɫɥɭɱɚɣɧɵɯ�ɱɢɫɟɥ Randomize() ‘ɩɨɥɭɱɚɟɦ�ɫɥɭɱɚɣɧɨɟ�ɱɢɫɥɨ�ɜ�ɞɢɚɩɚɡɨɧɟ�ɨɬ 1 ɞɨ 6 myRandom = Int(Rnd() * 6 ) + 1 ‘ɜɵɜɨɞɢɦ�ɪɟɡɭɥɶɬɚɬ�ɜ�ɨɤɧɨ�ɫɨɨɛɳɟɧɢɣ MessageBox.Show (myRandom, "ɋɥɭɱɚɣɧɨɟ�ɱɢɫɥɨ")

Заполним двумерный массив A(10) целыми случайными числами, лежащими в интервале от 0 до 50.

Случайное число в диапазоне (0,1) получим с помощью оператора Rnd( ). Для получения случайного числа из диапазона (0, 50), запишем Rnd( )*50, а чтобы это число

было целым – используем функцию Int( ), которая возвращает целую часть действительного числа.

і Аі 1 1 2 3 3 5 4 7 5 9 6 11 7 13 8 15 9 17

10 19

ɇȺɑȺɅɈ

ɄɈɇȿɐ

ii = 1, 10, 1

Ⱥɿ:= �Âɿ - 1

ȼȼɵɵɜɜɟɟɫɫɬɬɢɢ AAii

Page 10: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 9

Чтобы генерировать совершенно случайное число, перед опера-тором с функцией RND() в код программы поместим оператор Randomize().

Dim A(10) As Integer Dim i As Integer Randomize() For i = 0 To 10 A(i) = Int(Rnd() * 50) Next Как же узнать, какой элемент получил какое случайное значение?

Ɉɬɥɚɞɤɚ�ɡɚɩɨɥɧɟɧɢɹ�ɦɚɫɫɢɜɚ Создайте проект Фамилия_Array. Добавьте к форме кнопку Пример 1. Весь код, который приведен ниже, запишите в обработчик события

щелчка кнопки. Сначала объявите массив MyArray: Dim Array (20) As Integer Вспомните, что Array(0) — это первый элемент массива Array. Фактически выражение

Array(0) является именем целочисленной переменной. Используйте цикл, в котором заполните массив Dim ɿ As Integer Randomize() µɡɚɩɭɫɤɚɟɦ�ɝɟɧɟɪɚɬɨɪ�ɫɥɭɱɚɣɧɵɯ�ɱɢɫɟɥ For ɿ = 0 To 20 µɡɚɩɨɥɧɹɟɦ�ɦɚɫɫɢɜ�ɜ�ɰɢɤɥɟ Array(ɿ) = Int(Rnd()*50) µɡɚɩɨɥɧɹɟɦ�ɷɥɟɦɟɧɬɵ�ɫɥɭɱɚɣɧɵɦɢ�ɱɢɫɥɚɦɢ Next В режиме отладки проследите, как будут изменяться значения элементов массива во время

выполнения этого кода. Результат запишите (значения Array(0)=…, Array(1)=…, Array(2)=…, и так далее) и сообщите учителю.

Ɍɪɚɫɫɢɪɨɜɤɚ�ɡɚɩɨɥɧɟɧɢɹ�ɦɚɫɫɢɜɚ Установим контрольную точку, запустим отладку проекта.

Щелкнем кнопку. Наведем указатель мыши на индекс элемента массива. Определим значе-

ние индекса.

i = 0, 10, 1

Ai=ɫɥɭɱɚɣɧɨɟ(0;50)

Page 11: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 10

Наведем указатель мыши на имя массива Array. Определим значения элементов массива. Эти значения скрыты!

Для просмотра значений щелкнем по значку . Развернется список значений элементов

массива, а сам значок изменится на . С помощью стрелки можно просмотреть

другие, непоказанные на данный момент, значения элементов массива.

Прокрутите массив до конца. Значения всех элементов массива равны нулю

(по умолчанию эти значения задал оператор объявления массива Dim).

Нажимая клавишу F11, выполните отладку до конца и отследите, как код программы изменяет значения элементов массива и их индексов.

Значения результирующего массива (Array(0)= …, Array(1)= …, Array(2)= …, и так далее) запишите в тетрадь и сообщите учителю.

ВВОД И ВЫВОД значений элементов одномерного массива

ȼɜɨɞ�ɡɧɚɱɟɧɢɣ�ɷɥɟɦɟɧɬɨɜ�ɦɚɫɫɢɜɚ�ɢɡ�ɨɤɧɚ�ɜɜɨɞɚ Заполнять небольшой массив вводом данных с клавиатуры можно в окно ввода InputBox: Dim A(7) As Integer Dim i As Integer For i = 0 To 7 A(i) = InputBox ("ȼɜɟɞɢɬɟ A(” & i & “)”) Next Такой способ для заполнения большого массива громоздок и неудобен

ȼɵɜɨɞ�ɡɧɚɱɟɧɢɣ�ɷɥɟɦɟɧɬɨɜ�ɦɚɫɫɢɜɚ�ɜ�ɨɤɧɨ�ɜɵɜɨɞɚ Прежде чем вывести данные в окно вывода оператором MsgBox( ), сформируем строку со

всеми значениями элементов массива в текстовой переменной FlatOut. Делать мы это будем в цикле одновременно с заполнением значениями элементов массива.

Dim i As Integer Dim A(9) As Integer Dim FlatOut As String = "" For i = 0 To 9

+

Знак операции конкатенации & всегда окружен пробелами!

Page 12: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 11

A(i) = Int(Rnd() * 100) + 2 FlatOut = FlatOut & A(i) & vbTab Next MsgBox(FlatOut)

Вспомним, что добавление константы vbTab позволяет делать промежутки (табуляцию) меж-ду данными в строке FlatOut.

Этот способ вывода данных является не самым удобным для работы пользователя с полу-ченными результатами.

Ʉɨɦɩɨɧɟɧɬ�ɬɟɤɫɬɨɜɨɟ�ɩɨɥɟ TextBox Для ввода значений элементов массива в среде VB.Net можно воспользоваться многостроч-

ным текстовым полем – компонентом (элементом управления) TextBox на панели Toolbox, кото-рый можно разместить на форме так же, как и другие компоненты.

Зададим свойству Multiline значение true. Получим многострочное текстовое поле. Теперь можно задать ему нужный размер.

ɋɜɨɣɫɬɜɚ�ɬɟɤɫɬɨɜɨɝɨ�ɩɨɥɹ TextBox Среди свойств этого компонента много вам уже известных: Name, Co-lor, Font, Enabled,

Visible, Height, Width, Top, Left и другие. Рассмотрим еще несколько свойств многострочного текстового поля:

ScrollBars (англ. scroll - прокрутка, bars - прямоугольные полосы) – значение этого свойства определяет наличие или отсутствие на этом компоненте полос прокрутки (горизонтальной, вер-тикальной, обоих) для просмотра текста, если он выходит за пределы компонента; ReadOnly (англ. read - читать, only - только) - значение этого свойства определяет возмож-ность или невозможность редактирования содержимого компонента: False - можно редактиро-вать, True - нельзя (только для чтения) Lines (англ. lines - линии, строки) - значением этого свойства является набор значений (тек-стов), расположенных в строках этого компонента; каждая строка многострочного текстового поля имеет номер. Нумерация строк начинается с 0; Lines.Length (англ. length - длина) - значение этого свойства равно количеству заполненных данными строк компонента; это свойство отсутствует в списке свойств на вкладке Properties (свойства).

ȼɜɨɞ�ɡɧɚɱɟɧɢɣ�ɷɥɟɦɟɧɬɨɜ�ɦɚɫɫɢɜɚ�ɢɡ TextBox Ввод значений элементов массива из текстового поля выполним таким образом:

1. Определим число n (количество заполненных в поле TextBox1 строк) оператором n = TextBox1.Lines.Length 2. После этого объявим массив из n элементов Dim A(n) As Single 3. В цикле данные из строк с индексом i, полученных в свойстве первого поля TextBox1.Lines(i), с помощью функции Val переведем в числовой тип и присвоим их соответствующим элементам массива A(i).

Page 13: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 12

Цикл ввода массива из текстового поля TextBox1 будет иметь вид: For i = 0 To n - 1 A(i) = Val(TextBox1.Lines(i)) Next

Цикл выполняется до конечного значения n-1, поскольку значения индекса i начинаются не с первого номера, а с нулевого. Количество индексов с нулевого по n-1 равно числу n (количеству заполненных строк в TextBox1).

ȼɵɜɨɞ�ɡɧɚɱɟɧɢɣ�ɷɥɟɦɟɧɬɨɜ�ɦɚɫɫɢɜɚ�ɜ TextBox Вывод результатов в текстовое поле выполним таким образом:

1. Оператором TextBox2.Clear() очистим данные в поле.

2. В цикле выведем в текстовое поле значения элементов массива. Используем свойство Text текстового поля, присоединяя на каждой итерации цикла к строке тек-ста значение очередного элемента списка, а после него константу перехода на следующую стро-ку vbNewLine.

Цикл вывода массива в текстовое поле TextBox2 будет иметь вид: For i = 0 To n - 1 TextBox2.Text = TextBox2.Text & A(i) & vbNewLine Next Вспомним, что добавление константы vbNewLine работает аналогично нажатию клавиши

Enter во время ввода текста.

Задача 1. Ввод, обработка числового массива и вывод его в тек-стовое поле

ɉɨɫɬɚɧɨɜɤɚ�ɡɚɞɚɱɢ Рассмотрим задачу, в которой продемонстрируем, как объявить массив, размер которого за-

ранее неизвестен, как ввести значения элементов массива из многострочного текстового поля и как вывести значения элементов массива в многострочное текстовое поле. Задача 1. Ввести значения элементов массива действительных чисел, содержащихся в строках многострочного текстового поля, возвести эти числа в квадрат и вывести их в другое много-строчное текстовое поле. · Разместим на форме два многострочных текстовых поля с именами TextBox1 и TextBox2 и ус-

тановим для них значения свойств Height = 180, ScrollBars = Vertical. Разместим на форме соот-ветственно спискам надписи «Входной массив» и «Выходной массив», а также кнопку, устано-вим для нее Text = «Возвести в квадрат» и создадим обработчик события Click для кнопки.

· Ниже приведен текст соответствующей процедуры и окно с результатом выполнения проекта. В тексте процедуры использован стандартный метод для многострочного текстового поля Clear (англ. Clear - очищать), который очищает все строки этого компонента.

· Значения элементов массива изменим по формуле

ɉɪɨɝɪɚɦɦɧɵɣ�ɤɨɞ

2ii AA =

Page 14: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 13

ȼɵɩɨɥɧɟɧɢɟ После запуска проекта на выполнение в первом много-

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

Пока не закрыли окно проекта, можно ввести в первое мно-гострочное текстовое поле другие числа и снова выбрать кнопку «Возвести в квадрат». Тогда во втором многострочном текстовом поле увидим квадраты новых введенных чисел.

Ⱦɨɩɨɥɧɢɬɟɥɶɧɨɟ�ɡɚɞɚɧɢɟ Если закрыть окно выполнения проекта и затем еще раз запустить

проект на выполнение, то нужно будет снова вводить числа в строки первого многострочного текстового поля. Однако можно предвари-тельно ввести числа в это многострочное текстовое поле до запуска проекта на выполнение – на этапе конструирования формы.

Для этого нужно: 1. Выбрать многострочное текстовое поле. 2. Выбрать свойство справа в строке Lines окна Свойств. 3. Выбрать кнопку в конце строки String[]Array. 4. В окне Редактора строк ввести 10 чисел. 5. Выбрать кнопку ОК.

При сохранении проекта эти значения тоже сохранятся и автоматически появятся в поле после запуска проекта на выполнение.

Использование компонента ListBox при работе с массивами

Ʉɨɦɩɨɧɟɧɬ ListBox �ɫɩɢɫɨɤ) Для вывода на форму значений элементов массива в среде

VB.Net удобно использовать компонент ListBox (Список), рас-положенный на панели компонентов (управляющих элементов) Toolbox.

Page 15: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 14

Компонент Listbox предназначен для отображения тексто-вых данных.

Каждая строка Listbox сохраняет строку данных в тексто-вом формате.

Доступ к строкам данных предоставляет свойство Items этого компонента.

Свойства Top, Left, Height, Width, Name, Color, Enabled, Visible, Font, Text списка ListBox аналогичны соответствую-щим известным вам свойствам других компонентов.

Ɉɫɧɨɜɧɵɟ�ɫɜɨɣɫɬɜɚ�ɫɩɢɫɤɚ ListBox: Свойство Описание

Items Элементы списка Count Количество элементов списка Sorted Признак необходимой сортировки (если это свойство имеет значение

True) после добавления очередного элемента списка. Selectedlndex Номер выбранного элемента (нумерация начинается с нуля). Если ни

один из элементов не выбран, то значение номера равно –1) SelectedItem Текст выбранной строки HorizontalScrollBar Для добавления к списку горизонтальной полосы прокрутки устано-

вить значение true Для ввода строк в список Listbox необходимо выбрать значение (Collections) свойства Items

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

Ввод каждого значения завершается нажатием клавиши Enter.

Такое заполнение массива данными используют, когда данные массива задаются в Listbox до запуска программы.

Важным свойством списка Listbox является свойство Items (англ. Items – предметы), позво-ляющее обращаться к строкам списка программным путем.

Свойство ListBox1.Items.Count хранит количество строк в списке. Для чтения (ввода в программу) k-той строки из списка Listbox используют индекс этой

строки: ListBox1.Items(k). Для ввода чисел целесообразно использовать функцию перевода из текстового представле-

ния данных в числовой формат: Val(ListBox1.Items(k)) Для добавления (вывода) строки в список программным путем предназначен метод Add.

Синтаксис его вызова: ListBox1.Items.Add ("Hoвая_строка") Добавить в список ListBox значение числового элемента А(i) можно так:

ListBox1.Items.Add (Str (А(i))) Допускается также запись без функции Str: ListBox1.Items.Add (А(i)),

однако такая команда может вывести значение в искаженном виде.

Page 16: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 15

Чтобы очистить содержимое списка ListBox используют метод Clear: ListBox1.Items.Clear() Выполним решение задачи, в которой продемонстрируем, как ввести значения элементов

одномерного массива из списка Listbox и как вывести значения элементов одномерного массива в список Listbox.

Ɂɚɞɚɱɚ 1. ȼɨɡɜɟɞɟɧɢɟ�ɡɧɚɱɟɧɢɣ�ɦɚɫɫɢɜɚ�ɜ�ɤɜɚɞɪɚɬ Ввести значения элементов одномерного массива из целых чисел, содержащихся в строках спи-ска Listbox1, возвести эти числа в квадрат и вывести их в другой список Listbox2.

Разместим на форме два списка Listbox1 и Listbox2. Список Listbox1 запол-ним элементами массива – по одному элементу в каждой строке. Разместим на форме соответственно спискам надписи «Входной массив» и «Выходной массив», а также кнопку, установим для нее Text = «Возвести в квадрат» и создадим обработчик события Click для кнопки.

Ниже приведен текст соответствующей процедуры и окно с результатом выполнения проек-та. В тексте процедуры использованы два стандартных метода для списка Listbox: Clear (англ. Clear - очищать), который очищает все строки этого компонента, и Add (англ. Add - добавлять), который добавляет к списку Listbox новую строку и выводит в него значение параметра, указан-ного в скобках.

Ʉɨɞ�ɩɪɨɝɪɚɦɦɵ

ȼɵɩɨɥɧɟɧɢɟ

После запуска проекта на выполнение надо выбрать кнопку «Возвести в квадрат». В резуль-тате выполнения процедуры значения из строк первого списка будут присвоены соответствующим элементам од-номерного массива, а затем эти значения будут возведены в квадрат и выведены в строки второго списка.

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

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

Page 17: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 16

Ⱦɨɦɚɲɧɟɟ�ɡɚɞɚɧɢɟ Учить в пособии урок 6.1. Выполнить задания на стр. 18. Дополнительно читать в учебнике § 6.1. Ɋɚɛɨɬɚɟɦ�ɫ�ɤɨɦɩ¶ɸɬɟɪɨɦ. ȼɵɩɨɥɧɢɬɟ�ɡɚɞɚɧɢɹ Внимание! Во время работы с компьютером соблюдайте правила безопасности и санитарно-гигиенические нормы. I. Скарбниця знань. 4 клас. Масиви. II.�Ɂɚɞɚɧɢɟ 2. Создайте проект с именем Фамилия_Задача_6.1.2, в котором вводятся значения элементов массива из 8 целых чисел, нахо-дящихся в многострочном текстовом поле, каждое из этих чи-сел увеличивается на свой номер и результаты выводятся в другое многострочное текстовое поле. 1. Откройте окно среды VB.Net. 2. Разместите на форме два многострочных текстовых поля высотой 200 пикселей с вертикальными полосами прокрутки и кнопку с текстом «Изменить». Разместите на форме надписи «Входной массив» и «Выходной массив». 3. Сохраните проект в вашей папке. 4. Создайте обработчик события Click для кнопки и введите в него следующий код: Код обработчика события выбора кнопки (комментарии можно не набирать):

5. Сохраните обновленную версию проекта. 6. Запустите проект на выполнение. 7. Очистите 1-е многострочное текстовое поле и введите в него числа: -6; 12; -13; 0; 4, 138; -34; 55. 8. Выберите кнопку «Изменить». 9. Проанализируйте значения, выведенные во втором многострочном текстовом поле. 10. Измените несколько чисел в первом многострочном текстовом поле. 11. Выберите кнопку «Изменить». 12. Проанализируйте значения, выведенные во втором многострочном текстовом поле. 13. Закройте окно выполнения проекта. 14. Закройте окно среды VB.Net.

Page 18: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 17

ɉɪɨɟɤɬ�Ⱦɪɭɡɶɹ Задача 3. Создайте новый проект с именем Фамилия_Друзья, в котором в левое текстовое поле вводятся имена ваших дру-зей и каждое из этих имен записывается в текстовый массив, а сам массив выводится в правое многострочное текстовое поле. 1. Откройте окно среды VB.Net. 2. Создайте проект Фамилия_Друзья 3. Разместите на форме два многострочных текстовых поля:

TextBox1 для ввода списка друзей, TextBox2 для вывода.

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

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

5. К обработчику события щелчка кнопки Button1_Click добавьте код (комментарии можно не набирать):

Разберемся с фрагментами этой программы.

Сначала с помощью TextBox1.Lines.Length определили, сколько заполненных строк в первом текстовом поле и это число записали в n. Затем объявили массив А(n), в котором будут храниться n строк – n имен друзей из TextBox1.

Далее в цикле поэлементно присвоили значения n имен друзей переменным массива тексто-вого типа. Почему индекс i увеличивается не до n, а до n–1? Вспомним, как нумеруются элемен-ты массивов. Если в массиве, например, всего 5 элементов, последний будет иметь индекс 4.

Чтобы при повторном выполнении предыдущие результаты не мешали, очищаем второе поле методом TextBox2.Clear().

Для вывода массива во второе поле используем цикл, который «накапливает» в переменной TextBox2.Text имена друзей. Список значений массива лучше выглядит, если каждый новый элемент выводится с новой строки. Для этого применяется константа vbNewLine. 6. Запустите программу на выполнение. Введите в поле TextBox1 имена своих лучших друзей (каждое имя записывайте отдельной строкой). Щелкните кнопку. Имена будут отображены в правом текстовом поле. 7. Сохраните проект. Покажите результат учителю.

Если вам еще не совсем понятно, как работает этот метод, выполните программу в пошаговом режиме.

Page 19: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 18

Изменим наш проект так, чтобы он автомати- чески определял, у кого друзей больше. 8. На форме проекта над полем TextBox1 вставьте надпись Друзья Миши, а над полем TextBox2 — Друзья Даши.

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

Измените текст кнопки Button1 на Переписать в другое поле, добавьте еще одну кнопку и за-дайте ей текст У кого друзей больше?

Вид формы показан на рисунке. 9. Напишите программу, которая бы после нажатия кнопки У кого друзей больше? в поле Друзей больше у выводила имя Миши или Даши в зависимости от того, в каком из многострочных тек-стовых полей введено больше имен.

Вы можете использовать функцию Length и условный оператор If … Then … Else или опера-тор Select Case, а вот циклы для этого кода не нужны. 10. Запустите программу на выполнение и проверьте возможные варианты. Например, такие:

11. Сохраните проект. 12. Покажите результат учителю. ȼɵɩɨɥɧɢɬɟ�ɡɚɞɚɧɢɹ 1°. Запишите трассировку выполнения приведенного фрагмента для массива, значениями эле-ментов которого является числа: 2, -2, 3, 0,25; 4. dob = 1 for i = 0 to 4 : dob = dob * a (i) : Next i 2°. Запишите трассировку выполнения приведенного фрагмента программы для массива, значе-ниями элементов которой является числа: 0,5; 3; 2; -1,6. sum = 0 for i = 0 to 3 : sum = sum + a (i) * a (i) : Next i 3. Запишите строку объявления переменных типа массив: а) с именем х, состоящий из элементов вещественного типа с номерами от 1 до 50; б) с именем mas, состоящий из элементов вещественного типа с номерами от 0 до 35; в) с именем tab, состоящий из элементов целого типа с номерами от -7 до 12.

Page 20: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 19

Сколько элементов в каждой из этих табличных величин? Все ли такие массивы можно объявить в VB.Net? 4°. Запишите фрагмент программы, которая вводит в массив значения 8 действительных чисел, содержащихся в строках многострочного текстового поля.

5°. Запишите фрагмент программы, который выводит значения элементов массива из 11 чисел в строки многострочного текстового поля.

6. Создайте проект, в котором объявляется с инициализацией значений элементов массив из 8 целых чисел, каждое из этих чисел увеличивается на 17 и результаты выводятся в другое много-строчное текстовое поле. Сохраните проект с именем Фамилия_задача 6.1.6 в вашей папке.

7. Создайте проект, в котором вводятся из многострочного текстового поля значения элемен-тов массива 6 действительных чисел, каждое из этих чисел умножается на 3, и результаты выво-дятся в другое многострочное текстовое поле. Сохраните проект с именем Фамилия_задача 6.1.7. 8. Создайте проект, в котором значения элементов массива 12 элементов определяются по прави-лу 3*i - 2, где i - индекс элемента в этом массиве. Значение элементов массива выведите в много-строчное текстовое поле. Сохраните проект с именем Фамилия_задача 6.1.8 в вашей папке.

ɋɚɦɨɟ�ɜɚɠɧɨɟ�ɜ�ɷɬɨɦ�ɩɭɧɤɬɟ Упорядоченный набор переменных одного типа называется табличной величиной, или одно-

мерным массивом. Каждая переменная, входящая в массив, называется его элементом. Имя элемента массива состоит из имени этого массива и индекса этого элемента в массиве,

заключенного в круглые скобки. В Microsoft Visual Basic Express Edition значение нижнего индекса диапазона индексов все-

гда равно нулю. Если рассматривать массив из 100 элементов действительного типа, то в строке DIM соот-

ветствующий массив А такого типа записывается так Dim a(99) as Single Имена элементов этого массива: а(0), а(1), а(2), а(3), ..., а(99). Каждая из этих переменных

будет иметь тип Single. С помощью оператора Redim можно переопределить размер существующего массива. На языке Visual Basic.NET для генерации случайных чисел используют функцию Rnd( ).

Чтобы сгенерировать абсолютно случайное число, перед оператором с функцией RND( ) в код программы помещают оператор Randomize( )

Ⱥɥɝɨɪɢɬɦ�ɪɚɛɨɬɵ�ɫ�ɦɚɫɫɢɜɨɦ�ɦɨɠɟɬ�ɛɵɬɶ�ɫɥɟɞɭɸɳɢɦ: 1. Объявить массив в программе. 2. Заполнить массив данными. При необходимости вывести массив на форму 3. Обработать данные массива, решить поставленную задачу. 4. Вывести на форму результаты работы, если надо – результирующий массив.

ɋɩɨɫɨɛɵ�ɨɛɴɹɜɥɟɧɢɹ�ɨɞɧɨɦɟɪɧɨɝɨ�ɦɚɫɫɢɜɚ – Самый простой способ – оператор Dim <имя> (<верхний индекс>) As <тип> – Динамическое создание массива – Объявление массива с инициализацией

ɋɩɨɫɨɛɵ�ɡɚɩɨɥɧɟɧɢɹ�ɞɚɧɧɵɦɢ�ɨɞɧɨɦɟɪɧɨɝɨ�ɦɚɫɫɢɜɚ – Задание значений присваиванием – Задание значений элементам по формуле – Заполнение массива случайным образом

ȼɜɨɞ ɡɧɚɱɟɧɢɣ�ɨɞɧɨɦɟɪɧɨɝɨ�ɦɚɫɫɢɜɚ�ɦɨɠɧɨ�ɨɫɭɳɟɫɬɜɢɬɶ – из окна ввода – из многострочного текстового поля TextBox

Действия над массивами выполняются поэлементно в цикле, в котором после-довательно об-рабатываются элементы массива.

ȼɵɜɨɞ�ɡɧɚɱɟɧɢɣ�ɷɥɟɦɟɧɬɨɜ�ɦɚɫɫɢɜɚ�ɦɨɠɧɨ�ɨɫɭɳɟɫɬɜɢɬɶ, ɢɫɩɨɥɶɡɭɹ – окно вывода – Многострочное текстовое поле TextBox – компонент ListBox (Список).

Page 21: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 20

Ⱦɚɣɬɟ�ɨɬɜɟɬɵ�ɧɚ�ɜɨɩɪɨɫɵ 1. Что такое табличная величина (массив)? 2. Из чего состоит имя элемента массива? 3. Как объявляется переменная типа массив в строке Dim? 4. Что может использоваться как номер элемента массива? 5. Каким может быть диапазон номеров элементов массива в VB.Net? 6. Какие свойства многострочного текстового поля вы знаете? Что определяет значение каждого из них? 7. Как ввести числа в многострочное текстовое поле до запуска проекта? 8. Как ввести значения элементов массива в многострочное текстовое поле? 9. Как вывести значения элементов массива в многострочное текстовое поле? 10. Какие преимущества имеет использование массивов перед использованием отдельных пере-менных? 11. Что такое генератор случайных чисел? Какие операторы для работы с ним вы знаете?

Ɋɚɡɝɚɞɚɣɬɟ�ɪɟɛɭɫɵ

Page 22: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 21

ɉɟɪɟɣɞɟɦ�ɤ�ɜɵɩɨɥɧɟɧɢɸ�ɩɪɨɟɤɬɨɜ

ɉɪɨɟɤɬ�Ɇɨɧɟɬɚ Создадим программу, в которой можно увидеть, сколько раз за

N бросков монеты может выпасть орел. Создайте проект Фамилия_монета. Создайте форму, которая имеет вид, как на рисунке. Все выпадения монеты получим с помощью генератора слу-

чайных чисел, занесем в массив и выведем в список ListBox1. Компоненту PictureBox1 задайте свойства:

– SizeMode – StretchImage – BorderStyle – Fixed3D

Допустим, что 1 — это орел, а 0 — решка. Создайте массив целых чисел A(N), верхнюю границу индек-

сов N возьмите из текстового поля TextBox1. Заполните массив с помощью генератора случайных чисел значениями 0 и 1 операто-ром A(i) = Rnd(2). Выведите массив в список ListBox1.

Если массив просуммировать For i = 1 To n k = k + A(i) Next

то в k получим число выпадения орлов (добавление к сумме значения решки = 0 сумму не изме-нит!).

Количество выпадения орлов выведите в поле TextBox2. Готовый проект запустите на выполнение. Введите число N. Проверьте работу проекта, на-

жав несколько раз кнопку Выполнить.

Page 23: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 22

6.2 Обработка массивов ȼɨɩɪɨɫɵ

1. Какая величина называется табличной? 2. Что такое элемент массива (табличной величины)? Из чего состоит его имя? 3. Что такое индекс элемента массива? 4. Как описывается массив в строке Dim?

Ɉɫɧɨɜɧɵɟ�ɬɢɩɵ�ɡɚɞɚɱ�ɨɛɪɚɛɨɬɤɢ�ɨɞɧɨɦɟɪɧɵɯ�ɦɚɫɫɢɜɨɜ – задачи на изменение значений элементов массива; – задачи на нахождение суммы (произведения) элементов массива; – вычисление суммы и количества значений элементов, отвечающих определенным услови-

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

цикла. Задачи обработки массивов достаточно часто решают на практике: – Синоптики определяют самую большую, самую маленькую и среднюю температуру за

день, среднее количество осадков в течение месяца тому подобное. – В процессе определения победителей в некоторых соревнованиях отбрасывают наиболь-

шую и наименьшую оценки судей и вычисляют среднее арифметическое тех оценок, ко-торые остались.

– Администрацию вашего учебного заведения может интересовать, сколько учеников 9-х классов имеют семестровые оценки 10, 11 или 12 по информатике, есть ли в вашем классе ученики, получившие оценку 8 за последнюю практическую работу, и т. д.

В задачах, которые рассмотрим в этом пункте, будем вводить значения элементов массива из многострочного текстового поля, значения других переменных - из текстовых полей. Если ре-зультатом является значения элементов массива, то будем выводить его в многострочное тексто-вое поле или поле со списком, а значения других переменных - в надписи или однострочное тек-стовое поле.

Для решения задач создадим процедуры обработки события Click для кнопки. Будем рассматривать массивы из 20 элементов. Если количество элементов массива другое,

то в приведенные тексты процедур внесите соответствующие изменения. ȼɵɱɢɫɥɟɧɢɟ�ɫɭɦɦɵ (ɢɥɢ�ɩɪɨɢɡɜɟɞɟɧɢɹ) ɡɧɚɱɟɧɢɣ�ɢ�ɤɨɥɢɱɟɫɬɜɚ�ɷɥɟɦɟɧɬɨɜ

ɦɚɫɫɢɜɚ, ɫɨɜɩɚɞɚɸɳɢɯ�ɫ�ɡɚɞɚɧɧɵɦ

ȼɵɱɢɫɥɟɧɢɟ�ɩɪɨɢɡɜɟɞɟɧɢɹ�ɷɥɟɦɟɧɬɨɜ�ɦɚɫɫɢɜɚ Для вычисления произведения всех элементов одномерного массива необходим цикл со счет-

чиком. Предположим, что мы используем массив А(20), в котором эле-

менты с нулевыми индексами не задействованы в обработке (эле-менты с этими индексами не используем, они равны нулю), а индек-сация начинается с 1. Вычислим произведение элементов a1 ´ a2 ´ … ´ a20.

Поскольку мы выполняем умножение, то начальное значение пе-ременной для произведения должно быть равно 1.

Фрагмент программы: Pr = 1 For i = 1 To 20

Pr = Pr * A(i) Next i

i = 1, 20, 1

Pr = Pr ´�Ⱥ i

Pr = 1

Page 24: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 23

ȼɵɱɢɫɥɟɧɢɟ�ɫɭɦɦɵ�ɡɧɚɱɟɧɢɣ�ɷɥɟɦɟɧɬɨɜ�ɦɚɫɫɢɜɚ Задача 1. Определить сумму значений всех элементов массива. Обработка элементов массива будет выполняться с использованием

цикла. Используем переменную S для накопления суммы значений эле-

ментов массива. Перед циклом присвоим ей значение 0. В цикле последовательно будем просматривать элементы массива и

добавлять их значения к переменной S. Обратите внимание: если в цикле используется команда измене-

ния значения определенной величины (в данной задаче это сумма S), то перед циклом этой переменной обязательно нужно присвоить началь-ное значение (S = 0).

Для удобства заполним текстовое поле данными на этапе конст-руирования формы.

Код процедуры обработки щелчка кнопки:

ɉɨɞɫɱɟɬ�ɩɨɜɬɨɪɟɧɢɹ�ɡɚɞɚɧɧɨɝɨ�ɱɢɫɥɚ�ɜ�ɦɚɫɫɢɜɟ Задача 2. Определить, сколько раз заданное действительное число

встречается среди значений элементов массива. Очевидно, что для решения этой задачи нужно пересмотреть после-

довательно значения всех элементов массива, сравнить каждое из них с заданным числом, и если некоторое из них равно этому числу, то уве-личить счетчик таких элементов на 1.

Для удобства заполним данными текстовые поля на этапе конструи-рования формы.

Код процедуры обработки щелчка кнопки: Продолжение на следующем листе.

Page 25: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 24

Поиск в одномерном массиве

Задача 3. Определить, есть ли заданное действительное число среди значений элементов дан-ного массива. Если есть, сообщить имя элемента, совпадающего с искомым.

Вспомним: чтобы назвать имя элемента массива, достаточно знать имя массива и индекс этого элемента.

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

Такой метод решения этой задачи является нерациональным. Представим себе, что заданное число является значением уже перво-

го элемента массива. Тогда все остальные ее элементы просматривать уже не надо, и это значительно экономит время решения этой задачи, особенно если количество элементов массива велико.

Заполним массив из 20 элементов случайными числами от 1 до 20 и отобразим его в компоненте ListBox (списке). Искомое действительное число введем в текстовое поле, а результат выведем в надпись Label4.

Если пользователь не введет в поле TextBox1 значение искомого числа, то без функции Val оператор присваивания n = TextBox1.Text выдаст ошибку, а с функцией Val – присвоит переменной n значение равное нулю, что будет некорректно.

Поэтому в код программы добавлен оператор проверки: задано ли в поле искомое число. Если не задано – в тексте надписи будет выдано "Число не введено!"; если число введено, то будет осуществлен поиск числа в массиве.

Индекс элемента, который совпадает с искомым числом, сохраним в переменной k и сообщим его в имени элемента А(k) при выводе ре-зультата.

Для реализации рационального метода решения задачи используем переменную логического типа f и пусть ее значение false означает, что заданного числа среди значений элементов массива нет, а значение true - что есть.

Перед началом просмотра значений элементов массива присвоим переменной f значение false, ведь заданное число в табличной величине пока не нашлось.

Будем сравнивать в цикле последовательно значения элементов массива с заданным числом, и если одно из них равно заданному числу, то изменим значение переменной f на true и прервем выполнение цикла командой Exit (англ. Exit – выход).

Вывод реализуем в зависимости от значения переменной f. Код обработчика события щелчка кнопки с комментариями приведен на следующем слайде. Запустите и выполните проект для разных чисел.

Page 26: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 25

ɇɚɢɛɨɥɶɲɢɣ�ɢ�ɧɚɢɦɟɧɶɲɢɣ�ɷɥɟɦɟɧɬɵ�ɦɚɫɫɢɜɚ

ɉɨɢɫɤ�ɦɚɤɫɢɦɚɥɶɧɨɝɨ�ɡɧɚɱɟɧɢɹ Задача 4. Определить наибольшее значение элементов массива. Сначала будем считать, что значение первого (А0) элемента массива является наибольшим. После этого последовательно будем просматри-вать значения всех остальных элементов массива, и если встретится значение, большее того, которое на данный момент считаем самым большим, то теперь уже это значение будем считать наибольшим. Код обработчика события щелчка кнопки с комментариями:

Page 27: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 26

ɉɨɢɫɤ�ɦɚɤɫɢɦɚɥɶɧɨɝɨ�ɢ�ɦɢɧɢɦɚɥɶɧɨɝɨ�ɡɧɚɱɟɧɢɹ Задача 5. Дан массив, у которого значения всех элемен-

тов разные. Определить наибольшее и наименьшее значение среди элементов этого массива и поменять их местами.

Поскольку надо поменять местами наибольшее и наи-меньшее значения среди элементов массива, то нужно оп-ределить не только сами эти значения, но и индекс наи-большего по значению элемента, и индекс элемента, значе-ние которого наименьшее.

Определим все это, перебирая значения элементов мас-сива только один раз.

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

После этого последовательно переберем все остальные элементы массива.

Если значение очередного элемента массива больше того значения, которое на этот момент считаем самым большим, то заменяем наибольшее значение среди уже просмотренных и индекс самого элемента. Если нет, то возможно это значение меньше, чем то, которое пока считаем наи-меньшим. И если это так, то заменим наименьшее значение среди уже просмотренных и индекс наименьшего элемента.

Код процедуры обработки события Click кнопки

Ⱦɨɦɚɲɧɟɟ�ɡɚɞɚɧɢɟ Учить в пособии урок 6.2. Выполнить задания на стр. 28 . Дополнительно читать в учебнике § 6.2

Page 28: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 27

Ɋɚɛɨɬɚɟɦ�ɫ�ɤɨɦɩɶɸɬɟɪɨɦ. Ɂɚɞɚɱɚ 6 Внимание! Во время работы с компьютером соблюдайте правила безопасности и санитарно-гигиенические нормы. Задача 6. Многострочное текстовое поле содержит действительные числа. Известно, что их ко-личество не превышает 21. Ввести эти числа как значения элементов массива. Определить сумму значений и количество ее элементов, которые имеют положительные значения. Определить среднее арифметическое значений этих элементов. Вывести значения этих элементов в другое многострочное текстовое поле. 1. Откройте окно среды VB.Net. 2. Создайте проект с именем Фамилия_Задача_6.2.6 3. Разместите на форме:

– два многострочных (Multiline = true) текстовых поля высотой 300 пикселей с вертикаль-ной полосой прокрутки (свойство Scrollbars – Vertical);

– две надписи: над первым многострочным текстовым полем с текстом Элементы и над вторым - с текстом Положительные элементы;

– три текстовых поля; – три надписи по одному слева от каждого текстового поля с текстами соответствии Сум-

ма, Количество, Среднее арифметическое; – кнопку с текстом Положительные элементы и свойством AutoSize = true.

Ориентировочный вид формы с компонентами на ней:

4. Сохраните весь проект

в папке, которая называется Фамилия_6.2.

5. Создайте обработчик события Click для кнопки для вычисления суммы по-ложительных значений элементов массива.

Так как по условию за-дачи количество элементов табличной величины неиз-вестно, знаем только, что оно не превышает 21, то в строке Dim объявим массив максимально возможного числа элементов (21) с номерами от 0 до 20. Это позволит во время выполнения проекта вводить в первое многострочное текстовое поле любое количество чисел, не превышающее 21.

Для определения реального количества элементов для каждого такого ввода воспользуемся свойством TextBox1.Lines.Length, которое определяет реальное количество заполненных строк многострочного текстового поля. Вспомните: среднее арифметическое элементов массива вычисляется по формуле

6. Введите текст процедуры (можно без комментариев), приведенный на следующем листе. 7. Сохраните обновленную версию проекта. 8. Запустите проект на выполнение. 9. Введите в первое многострочное текстовое поле числа 3,4; -7; 0; -13; 8,75; 23; 15. Выберите кнопку Положительные элементы. Проанализируйте полученный результат. 10. Удалите числа из первого многострочного текстового поля и введите другие: -16; 98,43;

45; 0; 45; 1; 29; -2,67; 55. Выберите кнопку Положительные элементы. Проанализируйте полученный результат.

naaaaSredn n++++

=...321

Page 29: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 28

Код процедуры имеет вид:

11. Закройте окно выполнения проекта. 12. Добавьте в текст процедуры такой фрагмент: k = 0 For i = 0 To n - 1 If A(i) > 0 Then k = k + 1 End If Next TextBox4.Text = Str(k) а также переменную k в список переменных типа Integer в строке Dim. 13. Сохраните обновленную версию проекта. 14. Введите свой набор цифр в первое многострочное текстовое поле. Выберите кнопку По-

ложительные элементы. Проанализируйте полученные результаты. 15. Закройте окно выполнения проекта. 16. Добавьте в текст процедуры такой фрагмент: Sredn = S / k TextBox5.Text = Str(Sredn) а также переменную Sredn в список переменных типа Single в строке Dim. 17. Сохраните обновленную версию проекта. 18. Введите свой набор цифр к первому многострочного текстового поля. Выберите кнопку

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

19. Закройте окно выполнения проекта. 20. Закройте окно среды VB.Net.

ȼɵɩɨɥɧɢɬɟ�ɡɚɞɚɧɢɹ 1. Создайте проект, в котором вводятся значения элементов массива 7 целых чисел из много-

строчного текстового поля, вычисляется сумма отрицательных элементов и результат выводится в надпись. Сохраните проект в вашей папке с именем Фамилия_Задача 6.2.1.

Page 30: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 29

2. Создайте проект, в котором вводятся значения элементов массива 8 действительных чисел из многострочного текстового поля, определяется количество тех из них, которые больше пяти, и результат выводится в надпись. Сохраните проект в вашей папке с именем Фамилия_Задача 6.2.2.

3. Создайте проект, в котором вводятся значения элементов массива 9 целых чисел из много-строчного текстового поля; определяется, встречаются ли среди значений элементов числа, кото-рые меньше трех, и результат выводится в надпись. Сохраните проект в вашей папке с именем Фамилия_Задача 6.2.3.

4. Выпускник 11-го класса может получить грамоту за особые успехи в учебе по определен-ному предмету, если его годовая оценка по этому предмету - 12. Годовые оценки учеников клас-са по информатике введены в многострочное текстовое поле. Создайте проект для определения количества грамот, которые могут получить ученики этого класса. Сохраните проект в вашей папке с именем Фамилия_Задача 6.2.4.

5. Создайте проект, в котором вводятся значения элементов массива разных действительных чисел из многострочного текстового поля, количество которых не превышает 50; определяется наименьший и этот элемент меняется местами с первым элементом. Полученный массив выво-дится в поле со списком. Сохраните проект в вашей папке с именем Фамилия_Задача 6.2.5.

6. Создайте проект, в котором вводятся значения элементов массива из 10 действительных чи-сел из многострочного текстового поля, определяется наибольшее среди значений ее элементов и сколько в этом массиве имеется элементов с таким же значением. Полученный результат выво-дится в надпись. Сохраните проект в вашей папке с именем Фамилия_Задача 6.2.6.

7. Создайте проект, в котором вводятся значения элементов массива из 15 различных действи-тельных чисел из многострочного текстового поля, определяется наименьшее среди значений ее элементов и это значение обменивается местами со значением элемента, расположенным посере-дине. Значение измененного массива выведите в поле со списком ListBox. Сохраните проект в вашей папке с именем Фамилия_Задача 6.2.7.

ɋɚɦɨɟ�ɜɚɠɧɨɟ�ɜ�ɷɬɨɦ�ɩɭɧɤɬɟ Фрагмент процедуры для вычисления суммы значений всех элементов массива: for i = 0 to 10 s = s + a (i) Next Фрагмент процедуры для подсчета количества значений элементов массива, равных задан-

ному числу: s = 0 k = 0 for i = 0 to 10 If a (i) = X Then k = k + 1 Next Фрагмент процедуры для определения, есть ли заданное число среди значений элементов

массива: f = false for i = 0 to 10 If a (i) = X Then f = true : Exit For End If Next

Фрагмент процедуры для определения наибольшего значения среди элементов массива: max = ɚ (0) for i = 1 to 10 If a (i)> max Then max = a (i) next

Page 31: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 30

Фрагмент процедуры для определения наибольшего и наименьшего элементов массива, в ко-тором значения всех элементов различны, их номеров и перестановки этих значений местами:

max = A(0) : nmax = 0 : min = A(0) : nmin = 0 For i = 1 To n - 1 If A(i) > max Then max = A(i) : nmax = i ElseIf A(i) < min Then min = A(i) : nmin = i End If Next A(nmax) = min : A(nmin) = max

Обработка элементов одномерного массива M (1..N), удовлетворяющих определенному условию.

ɇɚɱɚɥɨ

Ʉɨɧɟɰ

i = 1,N,1

Ɉɛɪɚɛɨɬɤɚ i-ɝɨ�ɷɥɟ-ɦɟɧɬɚ�ɦɚɫɫɢɜɚ

Ɉɛɴɹɜɢɬɶ�ɢ�ɡɚɩɨɥɧɢɬɶ ɦɚɫɫɢɜ�Ɇ(1..N)

Основные блок-схемы

ɧɟɬ

Ʉɨɧɟɰ

Ɉɛɪɚɛɨɬɤɚ i-ɝɨ ɷɥɟɦɟɧɬɚ�ɦɚɫɫɢɜɚ

Ɉɛɴɹɜɢɬɶ�ɢ�ɡɚɩɨɥ-ɧɢɬɶ�ɦɚɫɫɢɜ�Ɇ(1..N)

ɞɚ ɍɫɥɨɜɢɟ

i = 1,N,1

ɇɚɱɚɥɨ

да

ȼɵɜɟɫɬɢ S

нет

ɇɚɱɚɥɨ

Ʉɨɧɟɰ

S = S + 1

Ɉɛɴɹɜɢɬɶ�ɢ�ɡɚɩɨɥ-ɧɢɬɶ�ɦɚɫɫɢɜ�Ɇ(1..N)

ɍɫɥɨɜɢɟ

i = 1, N, 1

S = 0

да

ȼɵɜɟɫɬɢ k

нет

ɇɚɱɚɥɨ

Ʉɨɧɟɰ

k = k + 1

Ɉɛɴɹɜɢɬɶ�ɢ�ɡɚɩɨɥ-ɧɢɬɶ�ɦɚɫɫɢɜ�Ɇ(1..N)

ɍɫɥɨɜɢɟ

i = 1, N, 1

k = 0

Обработка элементов одномерного массива M(1..N).

Нахождение суммы S элементов одномерного число-вого массива M(1..N), удовлетворяющих определен-

ному условию

Нахождение количества элементов одномерного массива M (1..N), удовлетворяющих определенному условию

Page 32: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 31

Ⱦɚɣɬɟ�ɨɬɜɟɬɵ�ɧɚ�ɜɨɩɪɨɫɵ 1. Для решения каких задач обработки массива можно использовать приведенные фрагменты? а) s = 0 : for i = 0 to 10 step 2 : s = s + a (i) : Next б) k = 0 : for i = 0 to 10 If a (i) <0 Then k = k + 1 Next в) k = 0 : for i = 0 to 10 If a (i) = x Then k = k + 1 Next 2. C какой целью в приведенном фрагменте использована переменная f? f = false : for i = 1 to 10 If a (i) = x Then f = true : Exit for end if next Каков тип этой переменной? Можно было бы с этой же целью использовать переменную другого типа? Ответ объясните. 3. Как нужно изменить приведенный фрагмент, чтобы в нем определялось наименьшее значение элементов табличной величины?

Pɚɯ = ɚ (0) for i = 1 to 10 If a (i)> max Then max = a (i) Next

4. Если в массиве несколько элементов имеют наибольшее значение среди значений всех элемен-тов этого массива, то следующий фрагмент определяет ли, какой из них наибольший?

max = ɚ (0) for i = 1 to 10 If a (i)> max Then max = a (i) next

ɇɚɯɨɠɞɟɧɢɟ�ɡɧɚɱɟɧɢɹ�ɢ ɩɟɪɜɨɝɨ�ɢɧɞɟɤɫɚ�ɧɚɢɛɨɥɶ-ɲɟɝɨ�ɷɥɟɦɟɧɬɚ�ɜ�ɨɞɧɨ-

ɦɟɪɧɨɦ�ɱɢɫɥɨɜɨɦ�ɦɚɫɫɢɜɟ M (1..N)

да нет

ɇɚɱɚɥɨ

ȼɵɜɟɫɬɢ max, index

Ʉɨɧɟɰ

Ɉɛɴɹɜɢɬɶ�ɢ�ɡɚɩɨɥɧɢɬɶ ɦɚɫɫɢɜ�Ɇ(1..N)

M(i)>max

i = 2,N,1

Max = M(1) Index = 1

Max = M(i) Index = i

Page 33: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 32

Изменится ли что-то, если в условном операторе изменить знак > на знак > =? 5. Для решения какой задачи обработки элементов массива можно использовать приведенные фрагменты? Сравните их эффективность.

6. Для чего используют свойство TextBox1.Lines.Length многострочного текстового поля? 7. Для решения какой задачи обработки элементов массива можно использовать такой фрагмент? s = 0: k = 0 for i = 0 to 10 If a (i)> 0 Then s = s + a (i) k = k + 1 end If Next sa = s / k В каких случаях при выполнении проекта по этому фрагменту может возникнуть ошибка?

Ɋɚɡɝɚɞɚɣɬɟ�ɪɟɛɭɫɵ

max = ɚ(0) : nmɚɯ = 0 min = ɚ(0) : nmin = 0 for ɿ = 1 to 10 If ɚ (ɿ) > max Then max = a (ɿ) : nmax = i ElseIf a(i) < min Then min = a(i) : nmin = i End If Next

max = a(0): nmax = 0 min = a(0): nmin = 0 for ɿ = 1 to 10 If a(i) > max Then max = a(i) : nmax = i End If If a(i) < min Then min = a(i): nmin = I End If Next

Page 34: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 33

ɉɟɪɟɣɞɟɦ�ɤ�ɜɵɩɨɥɧɟɧɢɸ�ɩɪɨɟɤɬɨɜ

ɉɪɨɟɤɬ SrednZnach Сгенерируйте массив из 20 случайных чисел из диапазона от N до M и вычислите их среднее

значение. Создайте проект Фамилия_SrednZnach. На форму поместите 3 текстовых поля, – в два будут вводится наименьшее (N) и наибольшее

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

ListBox1. Вычисления будут осуществляться после нажатия кнопки Вычислить.

Для генерирования случайных чисел от N до М можно использовать код: Dim MyRandomGenerator As System.Random MyRandomGenerator = New System.Random Dim RanNum As Integer ' Ƚɟɧɟɪɢɪɭɟɦ�ɫɥɭɱɚɣɧɭɸ�ɜɟɥɢɱɢɧɭ�ɨɬ N ɞɨ M, ɢɫɤɥɸɱɚɹ M RanNum = MyRandomGenerator.Next (N, M) Как работает этот код?

Сначала мы объявляем переменную типа System.Random, которая называется RandomGenerator. С помощью ключевого слова New создаем объект System.Random, и его значение присваиваем переменной RandomGenerator.

Затем объявляем переменную целочисленного типа, которая называется myRandom. После этого вызываем функцию Next (N, M) переменной RanNum, чтобы сгенерировать случайное чис-ло от N до M. Во время вызова функции Next (N,M) мы передаем ей аргументы N и M, которые являются нижним и верхним пределами диапазона случайных чисел, которые мы хотим сгенери-ровать.

Функция Next( ) возвращает случайное целое число от N до M – 1, которое присваивается переменной RanNum.

Готовый проект запустите на вы-полнение и проанализируйте его работу.

Сохраните проект. Результат работы покажите учите-

лю.

Page 35: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 34

ɉɪɨɟɤɬ�Ɍɚɣɧɵɣ�ɲɢɮɪ Если вам предстоит тайная встреча с друзьями, то информацию о времени и месте встречи

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

Зашифруйте строку по такому принципу: каждой букве нужно сопоставить определенное число (а = 1, б = 2, в = 3 и тому подобное, символу пробел сопоставляется 0), потом это число множится на 3 и к найденному произведению добавляется 2. Полученная последовательность чи-сел (для ее хранения следует использовать массив) записывается в обратном порядке.

Для определения длины текстовой строки txt можно использовать функцию Length. В опера-торе можно писать: txt.Length – 1. Создайте проект Фамилия_Шифр

На форме разместите два мно-гострочных текстовых поля: – в первое пользователь будет

вводить исходный текст, – во втором будет отображать-

ся зашифрованный резуль-тат.

Шифровка должна осуществ-ляться по нажатию кнопки За-шифровать.

Код процедуры обработчика щелчка кнопки:

Ⱦɨɩɨɥɧɢɬɟɥɶɧɨɟ�ɡɚɞɚɧɢɟ

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

Page 36: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 35

Использование компонента DataGridView ȼɨɩɪɨɫɵ

1. Каковы основные типы задач обработки одномерных массивов? Приведите примеры. 2. Какие элементы управления используются для ввода массивов? 3. Какие элементы управления используются для вывода массивов?

ɗɥɟɦɟɧɬ�ɭɩɪɚɜɥɟɧɢɹ DataGridView Вы уже ознакомились с приемами ввода и вывода значений элементов одномерного массива с

использованием компонентов многострочное текстовое поле TextBox и список ListBox. Но, поскольку алгоритмы обработки массивов предназначены для работы с таблицами дан-

ных, для большей наглядности работы программы желательно отражать содержимое массива в виде таблицы.

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

Такие элементы управления класса Data называют гридами (реже – сетками данных). Рассмотрим применение элементов управления DataGridView в VB для ввода данных из гри-

дов в массивы и для вывода данных из массивов в гриды. Таблица DataGridView содержит зафиксированные ячейки-заголовки столбцов и строк, вы-

деленные серым цветом, и обычные ячейки белого цвета. Грид состоит из строк (Rows) и обычно подписанных пользователем

столбцов (Columns). На их пересечении находятся ячейки (Cells), из которых можно читать данные и куда можно записывать данные «вручную» или про-граммным путем.

Гриды на форму вставляют из группы Data панели компонентов Toolbox.

Они получают порядковые номера, например: DataGridView1, DataGridView2 и т.д.

После размещения грида на форме выходит диалоговое окно DataGridView, в котором можно выбрать ссылку Add Column (добавить столбец).

Откроется окно Add Column, в котором в поле Header Text можно изменить название столб-ца, например на 0.

Выберите кнопку Add. Так же добавляются другие столбцы. Когда все столбцы добавлены в грид, выберите

кнопку Cancel. Создадим 6 столбцов с заголовками от 0 до 5 Получили таблицу, состоящую из одной строки (одномерный массив представляет собой как

раз такую таблицу). Рассмотрим пример настройки вида объекта StringGrid для отображения одномерного массива. Отображение зафиксированной строки с названиями столбцов (например, индексами элементов массива) является обязательным и бывает очень полезным при анализе правильности работы программы.

Page 37: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 36

На этапе конструирования формы заполнять таблицу не получится. После запуска программы на выполнение одна из ячеек будет выделенной и ее содержимое мож-но изменять (редактировать). Выбор ячейки в гриде осуществляется так же, как и в таблице в Ex-cel.

На этапе конструирования в окне свойств Properties можно задать свойства:

– AutoSizeColumnsMode – Fill (вместить все ячейки в ширину грида), – BorderStyle - Fixed3D (стиль границы грида), – BackgroundColor (цвет незанятой ячейками

Свойство Columns (Collection) открывает доступ к окну редактирования отдельных колонок грида. Программным путем можно изменить подписи столбцов. Можно добавить пустые строки с

помощью оператора DataGridView1.Rows.Add (). В компоненте DataGridView свойство Rows означает строку, а свойство Cells – столбец. Выражение DataGridView1.Rows (i).Cells(j).Value предоставляет доступ к данному, которое

находится в i-й строке в ячейке с номером j. Внимание! Нумерация начинается с нуля. В левом верхнем углу таблицы (первым в табли-

це) стоит значение DataGridView1.Rows(0).Cells(0).Value.

ȼɵɜɨɞ�ɢ�ɜɵɜɨɞ�ɞɚɧɧɵɯ

Занести (вывести) значения некоторого массива А(5) с нумерацией элементов от нуля в за-ранее подготовленный (с необходимым количеством столбцов) грид DataGridView1 можно таким образом:

For i = 0 To 5 DataGridView1.Rows(0).Cells(i).Value = Ⱥ(i) Next ɿ

Оформление (стиль) столбца

Заголовок столбца «0»

Удаление выделен-ного столбца «0»

Page 38: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 37

Чтобы ввести данные из грида в массив A(5), надо в цикле выполнить оператор A(i) = DataGridView1.Rows(0).Cells (i).Value Пример. Заполнить массив случайными числами: Dim a(5) As Integer Dim ɿ As Integer ' ɢɧɞɟɤɫ Randomize() For ɿ = 0 To 5 a(ɿ) = Rnd() * 20 DataGridView1.Rows(0).Cells(ɿ).Value = a(ɿ) Next

Ɉɛɪɚɛɨɬɤɚ�ɨɞɧɨɦɟɪɧɨɝɨ�ɦɚɫɫɢɜɚ�ɫ�ɢɫɩɨɥɶɡɨɜɚɧɢɟɦ�ɝɪɢɞɚ Ɂɚɞɚɱɚ 1. ȼɵɜɨɞ�ɦɚɫɫɢɜɚ�ɜ�ɝɪɢɞ

Задача 1. Заполнить одномерный массив А(0…5) случайными значениями от 0 до 20 и вы-вести его в грид. Вычислить сумму и среднее арифметическое элементов массива.

Решение. Вставим на форму грид, кнопку «Заполнить и найти среднее арифметическое», две надписи «Сумма элементов =» и «Среднее арифметическое =», а также два соответствующих им текстовых поля.

В конструкторе грида построим коллек-цию столбцов, которые подпишем «0», «1», «2», ..., «5» и зададим свойству AutoSizeCol-umnxMode значение Fill.

Вид формы показан на рисунке. Создадим программный код для вывода

таблицы в грид, вычисления суммы и среднего арифметического и назначим его кнопке «За-полнить и найти среднее арифметическое». Код обработки события щелчка кнопки:

Page 39: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 38

Ɋɚɛɨɬɚɟɦ�ɫ�ɤɨɦɩɶɸɬɟɪɨɦ ɉɪɨɟɤɬ Перестановка

Задача 2. В массиве А (0...9) переставить местами элементы, стоящие на четных и нечетных местах: А (0) ↔ А (1), ..., А (8) ↔ А (9).

1. Создайте новый проект с именем Фамилия_ Перестановка 2. Измените свойство Text формы на «Перестановка». 3. Разместите на форме компонент DataGridView и командную кнопку. Измените свойство

Text кнопки на «Выполнить перестановку». В конструкторе грида постройте коллекцию столб-цов, которые подпишите «0», «1», «2»,..., «9» и задайте свойству AutoSizeColumnxMode значение Fill. В этот грид выведем исходный массив. Выделите грид, скопируйте его в буфер обмена, вставьте его из буфера на форму. Во второй грид выведем результат выполнения проекта.

4. Объявите глобальные переменные после строки Public Class Form1 Dim a(9) As Integer Dim і As Integer ' индекс 5. В процедуре обработки события Form1_Load для формы запрограммируйте заполнение

массива элементами и вывод массива в грид: Randomize() For і = 0 To 9 a(і) = Rnd() * 20 DataGridView1.Rows(0).Cells(і).Value = a(і) Next

6. В процедуре обработки события щелчка кнопки Выполнить перестановку запрограммируйте: – ввод элементов в массив из грида (на случай, если пользователь откорректировал грид

вручную после открытия окна проекта); – попарную перестановку элементов; – вывод значений элементов массива в таблицу второго грида.

Код обработчика события щелчка кнопки:

Page 40: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 39

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

грид с клавиатуры в ходе выполнения программы); – замену нулями элементов, имеющих четные индексы; – вывод значений элементов массива в таблицу второго грида. Сохраните проект в папке Фамилия_6.3. Завершите работу за компьютером.

ɋɚɦɨɟ�ɜɚɠɧɨɟ�ɜ�ɷɬɨɦ�ɩɭɧɤɬɟ Таблица DataGridView содержит зафиксированные ячейки-заголовки столбцов и строк, вы-

деленные серым цветом, и обычные ячейки белого цвета. Грид состоит из строк (Rows) и подписанных пользователем столбцов (Columns). На их пере-

сечении находятся ячейки (Cells), из которых можно читать данные и куда можно записывать данные «вручную» или программным путем.

Гриды на форму вставляют из группы Data панели компонентов Toolbox. На этапе конструирования формы заполнять таблицу грида не получится. На этапе конструирования в окне свойств Properties можно задать свойства:

– AutoSizeColumnsMode – Fill (вместить все ячейки в ширину грида), – BorderStyle - Fixed3D (стиль границы грида), – BackgroundColor (цвет незанятой ячейками области грида) и прочие. Свойство Columns (Collection) открывает доступ к окну редактирования отдельных колонок

грида. Пустые строки можно добавить с помощью оператора DataGridView1.Rows.Add (). Выражение DataGridView1.Rows (i).Cells(j).Value предоставляет доступ к данному, которое

находится в i-й строке в ячейке с номером j. Следует помнить, что нумерация начинается с нуля. Вывести значения некоторого одномерного массива А(n) с нумерацией элементов от нуля в

заранее подготовленный (с необходимым количеством столбцов) грид DataGridView1 можно та-ким образом:

For i = 0 To n DataGridView1.Rows(0).Cells(i).Value = Ⱥ(i) Next ɿ Чтобы ввести данные из грида в массив A(n), надо в цикле выполнить оператор A(i) = DataGridView1.Rows(0).Cells (i).Value

Ⱦɨɦɚɲɧɟɟ�ɡɚɞɚɧɢɟ Учить в пособии урок 6.3. Ответить навопросы и выполнить задания.

ȼɨɩɪɨɫɵ�ɢ�ɡɚɞɚɧɢɹ 1. Объясните схему настройки вида объекта DataGridView для отображения одномерного

массива. 2. Какое свойство грида отвечает за возможность редактирования ячеек его таблицы? 3. Запишите программный код для того, чтобы наибольший элемент последовательности из

10 цифр заменить нулем. 4. Запишите программный код для того, чтобы поменять местами первый и самый элементы

последовательности из 10 цифр. 5. Дано 20 вещественных чисел. Составьте программу для определения, сколько из них

больше своих «соседей», то есть за предыдущее и последующее числа. 6. В фигурном катании общая оценка качества выполнения элемента вычисляется как усе-

ченное среднее оценок, данных 9 судьями. Для этого отбрасываются самая высокая и самая низ-кая оценки, а из оставшихся вычисляется среднее арифметическое. Составьте программу для оп-ределения оценки по этим правилам.

Page 41: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 40

ɉɪɚɤɬɢɱɟɫɤɚɹ�ɪɚɛɨɬɚ 12 ©ɋɨɫɬɚɜɥɟɧɢɟ�ɢ�ɢɫɩɨɥɧɟɧɢɟ�ɚɥɝɨɪɢɬɦɨɜ�ɧɚɯɨɠɞɟɧɢɹ�ɫɭɦɦ�ɢ�ɤɨɥɢɱɟɫɬɜ�ɡɧɚɱɟɧɢɣ�ɷɥɟ-ɦɟɧɬɨɜ�ɬɚɛɥɢɱɧɵɯ�ɜɟɥɢɱɢɧ�ɩɨ�ɡɚɞɚɧɧɵɦ�ɭɫɥɨɜɢɹɦ�ɜ�ɫɪɟɞɟ�ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ VB.Net»

Внимание! Во время работы с компьютером соблюдайте правила безопасности и санитар-но-гигиенические нормы. Создайте проект для решения задачи: Дана таблица количества осадков в течение года по месяцам:

Номер месяца 1 2 3 4 5 6 7 8 9 10 11 12

К-во осадков, мм 54 12 30 15 40 32 10 20 46 60 56 38 Требуется определить: а) количество осадков за год; б) в каком месяце количество осадков была наименьшей; в) в каком месяце количество осадков была наибольшей; г) в какие месяцы количество осадков было меньше 40, количество таких месяцев.

1. Создайте новый проект с именем Фамилия_ПР12. 2. Разместите на форме компоненты согласно рисунку: компонент DataGridView; четыре ко-мандные кнопки (по количеству вопросов, поставленных в задании); компонент ListBox и (по желанию) картинку в компоненте PictureBox. 3. Настройте свойства элементов управления.

а) Параметру грида AutoSizeColumnsMode задайте значение Fill. б) Задайте размер шрифта в свойстве Font равным 9 пт, а в списке ListBox - 10 пт. в) Если вставите картинку в компонент PictureBox1 (свойство Image), то не забудьте в его

свойстве Sizemode выбрать значение StretchImage. Форма должна принять вид, как на рисунке.

Перейдем к созданию программного кода проекта. 4. Опишите массивы для сохранения названий месяцев и количеств осадков в коде проекта

под строкой Public Class Form1 как глобальные: Dim month() As String = {"январь ", " Февраль ", " Март ", " Апрель ", "Май", "Июнь",

"Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"} Dim mas() As Integer = {54, 13, 30, 15, 40, 32, 10, 20, 46, 60, 56, 38} 5. В процедуре обработки события Form1_Load для формы запрограммируйте вывод значе-

ний элементов массива осадков в первую строку таблицы грида: Dim i As Integer For i = 0 To 11 DataGridView1.Rows(0).Cells(i).Value = mas(i) Next

Page 42: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 41

6. Пользуясь алгоритмом нахождения суммы элементов массива, создайте процедуру обра-ботки события Click для командной кнопки Количество осадков за год, мм.

7 . Создайте процедуру обработки события Click для командной кнопки Самый сухой месяц, используя алгоритм поиска наименьшего элемента массива:

Dim i, Min, k As Integer Min = mas(0) k = 0 For i = 1 To 11 If mas(i) < Min Then Min = mas(i) k = i End If Next ListBox1.Items.Add("ɋɚɦɵɣ�ɫɭɯɨɣ�ɦɟɫɹɰ " & month(k)) 8. Создайте процедуру обработки события Click для командной кнопки Самый влажный ме-

сяц, используя обычный алгоритм поиска максимального элемента массива. 9. Пользуясь алгоритмом поиска элементов с заданным критерием, создайте процедуру обра-

ботки события для кнопки В какие месяцы количество осадков < 40. Dim i, k As Integer ListBox1.Items.Add("Ɇɟɫɹɰɵ�ɫ�ɤɨɥɢɱɟɫɬɜɨɦ�ɨɫɚɞɤɨɜ < 40 ɦɦ:") For i = 0 To 11 If mas(i) < 40 Then ListBox1.Items.Add(month(i)) End If Next 10. Добавьте к процедуре обработки события для кнопки В какие месяцы количество осадков

< 40 мм операторы для вычисления k- количества элементов массива mas, удовлетворяющих ус-ловию, и вывод значения К в поле списка ListBox1.

11. Добавьте к процедуре обработки события для кнопки Количество осадков за год, мм опе-раторы для вычисления среднего арифметического элементов массива mas и вывода этого зна-чения в поле списка ListBox1.

12. Проверьте работу программы. 13. Сохраните проект в папке Практическая работа 6. 14. Покажите результат работы учителю. Завершите работу за компьютером. Сделайте вывод: как применять типичные алгоритмы обработки одномерных массивов для решения задач.

Page 43: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 42

Ɋɚɡɝɚɞɚɣɬɟ�ɪɟɛɭɫɵ

Page 44: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 43

6.4 Сортировка. Поиск в упорядоченном массиве ȼɨɩɪɨɫɵ 1. Какие типичные задачи обработки массивов вы знаете? 2. Какими способами можно вывести массив на форме? 3. По какому алгоритму осуществляется поиск заданного значения в числовом массиве?

Ⱥɥɝɨɪɢɬɦɵ�ɭɩɨɪɹɞɨɱɟɧɢɹ�ɷɥɟɦɟɧɬɨɜ�ɦɚɫɫɢɜɚ Во время обработки таблиц часто возникает потребность упорядочить данные в таблице по

некоторому признаку. Числовые данные можно упорядочить по величине (например, расположение в массиве зна-

чений массы деталей по возрастанию), а строчные (текстовые) данные - в алфавитном порядке (составление списка учащихся). Сортировка элементов массива - это процесс перестановки элементов с целью упорядочения их по некоторому признаку.

Другими словами, сортировка – это расстановка элементов массива в заданном порядке (по возрастанию, убыванию, последней цифре, … – для числового массива; а для текстового масси-ва – по алфавиту или по длине строк элементов).

«Отсортированный в порядке возрастания» означает, что каждый элемент массива больший, чем предыдущий, а «в порядке убывания» — меньший.

Какие же алгоритмы скрываются под словом «сортировка»? Алгоритмов сортировки существует много: простые и понятные, но неэффективные для больших массивов, а также более сложные, но и более эффективные при этом методы сортировки.

Существуют такие алгоритмы: – сортировка обменом – «пузырьковая» – сортировка выбором – сортировка вставками – сортировка подсчетом – Гномья сортировка – сортировка расческой – сортировка Шелла – сортировка слиянием – Быстрая сортировка – сортировка кучей (пирамидальная) – и другие

ɋɨɪɬɢɪɨɜɤɚ�ɨɛɦɟɧɨɦ (ɦɟɬɨɞ�ɩɭɡɵɪɶɤɚ) В сортировке обменом элемент "всплывает" или "тонет", как пузырек в воде. Рассмотрим, как самый маленький ("легкий") элемент перемещается вверх ("всплывает").

Начиная снизу, сравниваем два соседних элемента; если они стоят "неправильно", меняем их местами. За один проход по массиву один элемент (самый маленький) становится на свое место.

Первый проход Второй проход Третий проход

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

Page 45: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 44

Проходы по массиву повторяются N - 1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны — это означает, что массив отсортирован. Рассмотрим пример сортировки массива А(0…9) по убыванию методом пузырька. For i = 0 To 8 For j = 0 To 8 - i If a(j) < a(j + 1) Then u = a(j) a(j) = a(j + 1) a(j + 1) = u End If Next j DataGridView1.Rows.Add(1) For k = 0 To 9 DataGridView1.Rows(i + 1).Cells(k).Value = a(k) Next k Next i

Этот алгоритм не содержит проверки: не окажется ли на очередном проходе, что обмены больше не нужны?

Подумайте, как это сделать.

ɋɨɪɬɢɪɨɜɤɚ�ɜɵɛɨɪɨɦ (ɦɟɬɨɞ�ɦɢɧɢɦɚɥɶɧɵɯ�ɷɥɟɦɟɧɬɨɜ) Работа алгоритма сортировки по возрастанию массива, со-стоящего из N элементов, методом выбора состоит в последовательном поиске минимальных элементов и их перемещении к началу массива с помощью перестановок с элементами, имею-щими меньший индекс.

Идея метода: – найти минимальный элемент и

поставить на первое место (поменять местами с A1)

– из оставшихся найти мини-мальный элемент и поставить на второе место (поменять местами с A2), и т.д.

Как и сортировка пузырьком, этот алгоритм проходит по массиву раз за разом, перемещая одно значение на правильную позицию.

Рассмотрим массив: 6 4 12 10 1 8 3. Как видите, он не отсортирован. Этот массив, отсортированный в порядке возрастания, вы-глядит так: 1 3 4 6 8 10 12, а отсортированный в порядке убывания — 12 10 8 6 4 3 1. Как можно привести исходный массив в отсортированный вид по возрастанию? Прежде всего отметим, что наименьшее число должно стоять первым (если сортировать в по-рядке возрастания). Для этого нужно наименьший элемент (в нашем массиве это 1) поменять местами с первым элементом (число 6): 1 4 12 10 6 8 3.

В массиве 1 4 12 10 6 8 3 число 1 уже отсортировано – оно стоит на своем месте, поэтому те-перь на него можно не обращать внимания и проводить сортировку других чисел так, как будто массив начинается со второго элемента (с числа 4). Повторяем те же действия, которые уже делали, но уже с меньшим массивом. В нем наи-меньшим числом является 3, а первым элементом — 4. Поменяем их местами: 1 3 12 10 6 8 4 Аналогичные действия надо повторять, пока не дойдем до конца массива: 1 3 4 10 6 8 12

i = 0, 8, 1

j = 0, 8 – i, 1

k = 0, 9, 1

да

нет A(i) < A(i+1)?

U = A ( i )

A ( i ) = A ( i + 1)

A ( i + 1 ) = U

ȼɵɜɨɞ Ⱥ(k)�ɜ�ɝɪɢɞ

Page 46: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 45

1 3 4 6 10 8 12 1 3 4 6 8 10 12 1 3 4 6 8 10 12

Задачи

ɋɨɪɬɢɪɨɜɤɚ�ɦɟɬɨɞɨɦ�ɜɵɛɨɪɚ Задача 1. Заполнить одномерный массив А(0…9) случайными значениями от 0 до 20 и вы-

вести его в грид. Выполнить сортировку массива по возрастанию методом выбора и на каждом шаге вывести массив в отдельной строке грида. Решение. Вставим на форму грид и кнопку «Выполнить сортировку».

В конструкторе грида построим коллекцию столбцов, которые подпишем «0», «1», «2»,..., «9» и зададим свойству AutoSizeColumnxMode значение Fill, а свойству AllowUserToDeleteRows значение False (это необходимо для корректного вывода в грид).

Форма примет вид, как на рисунке:

Сохраните проект с именем Фамилия_сортировка_выбор Создадим программный код для вывода таблицы в грид и выполнения сортировки. Объявим глобальные переменные после строки кода Public Class Form1: Dim a(9) As Integer Dim i, j, k, u As Integer Двойным щелчком по форме создадим событийную процедуру ее загрузки и в ней запишем

код заполнения массива случайными числами и вывод его в первую (с индексом 0) строку грида. DataGridView1.Rows.Add(1) Randomize() For i = 0 To 9 a(i) = Rnd() * 20 DataGridView1.Rows(0).Cells(i).Value = a(i) Next Создадим программный код для кнопки «Выполнить сортировку».

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim min, n As Integer ɋɨɡɞɚɟɦ�ɞɜɨɣɧɨɣ�ɰɢɤɥ For i = 0 To 8 ' - ɧɚ 1 ɦɟɧɶɲɟ�ɜɟɪɯɧɟɣ�ɝɪɚɧɢɰɵ�ɢɧɞɟɤɫɨɜ�ɦɚɫɫɢɜɚ ' ɢɳɟɦ�ɦɢɧ�ɷɥɟɦɟɧɬ min = a(i) n = i For j = i + 1 To 9 If a(j) < min Then min = a(j) n = j End If Next j

Page 47: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 46

' ɩɟɪɟɫɬɚɧɨɜɤɚ u = a(i) a(i) = a(n) a(n) = u ' ɜɵɜɨɞɢɦ�ɪɟɡɭɥɶɬɚɬ DataGridView1.Rows.Add(1) For k = 0 To 9 ' ȼɵɜɨɞɢɦ�ɨɬɫɨɪɬɢɪɨɜɚɧɧɵɣ�ɧɚ i-ɬɨɦ�ɲɚɝɟ�ɦɚɫɫɢɜ DataGridView1.Rows(i + 1).Cells(k).Value = a(k) Next k Next i

End Sub Сохраните проект, запустите на выполнение, проанализируйте – осуществляется ли сорти-

ровка в соответствии с методом выбора.

ɉɪɨɟɤɬ Sort Для закрепления изученного метода выполним проект. Задача 1А. Создайте проект Фамилия_Sort. Вид формы показан на рисунке. Разработайте программу, которая после нажатия кноп-

ки «Заполнить и сортировать» заполнит массив А(25) слу-чайными числами от 1 до 99, отобразит массив в списке ListBox1 (Исходный массив), выполнит сортировку масси-ва, после чего выведет его в другом поле – ListBox2 (Ре-зультат).

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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i, j As Integer Dim a(25) As Single ' ɡɚɞɚɟɦ�ɦɚɫɫɢɜ�ɢɡ 25 ɷɥɟɦɟɧɬɨɜ Dim u As Single ' ɡɚɞɚɟɦ�ɩɟɪɟɦɟɧɧɭɸ u ɞɥɹ�ɡɚɩɨɦɢɧɚɧɢɹ�ɱɢɫɟɥ ListBox1.Items.Clear() ' ɨɱɢɳɚɟɦ�ɫɩɢɫɨɤ

Page 48: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 47

For i = 1 To 25 ' Ɂɚɞɚɟɦ�ɡɧɚɱɟɧɢɟ�ɤɚɠɞɨɦɭ�ɷɥɟɦɟɧɬɭ�ɦɚɫɫɢɜɚ a(i) = Fix(Rnd() * 100) ' ɋɥɭɱɚɣɧɨɟ�ɱɢɫɥɨ�ɨɬ 1 ɞɨ 99 ListBox1.Items.Add(a(i)) ' ɉɟɱɚɬɚɟɦ�ɧɚ ListBox1 Next ɋɨɡɞɚɟɦ�ɞɜɨɣɧɨɣ�ɰɢɤɥ For i = 1 To 25 ' ɝɞɟ�ɤɨɧɟɱɧɨɟ�ɱɢɫɥɨ�ɰɢɤɥɚ�ɪɚɜɧɨ�ɤɨɥɢɱɟɫɬɜɭ�ɱɢɫɟɥ�ɜ�ɦɚɫɫɢɜɟ For j = 1 To 24 Ɍɭɬ�ɤɨɧɟɱɧɨɟ�ɱɢɫɥɨ�ɰɢɤɥɚ�ɪɚɜɧɨ�ɤɨɥɢɱɟɫɬɜɭ�ɱɢɫɟɥ�ɜ�ɦɚɫɫɢɜɟ – 1 If a(j) > a(j + 1) Then ' ȿɫɥɢ�ɩɪɟɞɵɞɭɳɟɟ�ɱɢɫɥɨ�ɛɨɥɶɲɟ�ɫɥɟɞɭɳɟɝɨ, ɬɨ u = a(j) ' Ɂɚɩɨɦɢɧɚɟɦ�ɩɪɟɞɵɞɭɳɢɟ�ɱɢɫɥɨ�ɜ�ɩɟɪɟɦɟɧɧɭɸ u a(j) = a(j + 1) ' ɉɪɟɞɵɞɭɳɟɟ�ɱɢɫɥɨ�ɩɪɢɪɚɜɧɢɜɚɟɦ�ɫɥɟɞɭɸɳɟɦɭ a(j + 1) = u ' Ⱥ�ɫɥɟɞɭɸɳɟɟ�ɱɢɫɥɨ�ɡɚɦɟɧɹɟɦ�ɱɢɫɥɨɦ u End If Next Next ListBox2.Items.Clear() ɨɱɢɳɚɟɦ�ɫɩɢɫɨɤ For i = 1 To 25 ' ȼɵɜɨɞɢɦ�ɜɟɫɶ�ɩɨɥɭɱɢɜɲɢɣɫɹ (ɨɬɫɨɪɬɢɪɨɜɚɧɧɵɣ) ɦɚɫɫɢɜ ListBox2.Items.Add(a(i)) ' ɜ ListBox2 Next End Sub

Ɂɚɞɚɱɚ 2. ɉɪɨɟɤɬ Sort2 Задача 2. Создайте проект Фамилия_Sort2.

1. Откройте окно среды VB.Net. 2. Разместите не форме 2 многострочных текстовых поля с па-раметрами Multiline = true и ScrollBars = Vertical. Поместите на форму 2 надписи и кнопку, а также флажок CheckBox1. Занесите соответствующие названия в текстах этих элементов.

Значения в левое многострочное текстовое поле введите на этапе создания формы. Для этого воспользуйтесь редактором строк, который можно открыть, выбрав в окне свойств много-строчного текстового поля справа от свойства Lines кнопку в конце строки String[]Array 3. Разработайте программу, которая после нажатия кнопки «Ото-бразить» отобразит отсортированный исходный массив, задан-ный в Lines(String [] Array) поля Textbox1 (Входной массив), в другом поле – Textbox2 (Результат).

Если установлен флажок, массив должен отображаться в об-ратном порядке. 4. Массив в программе объявите динамически с помощью операторов

Dim Arr() as Single n = TextBox1.Lines.Length ReDim Arr (n - 1)

5. Если при таком создании массива TextBox1 не будет содержать ни одной строки (пуст), то опе-ратор ReDim Arr (0 - 1) выдаст ошибку из-за несуществующего индекса. Чтобы избежать подоб-ных ошибок, в код программы целесообразно вставить оператор проверки значения n. Если n <= 0, то следует выдать об этом сообщение и завершить работу программы.

If n <= 0 Then MsgBox("ɉɨɥɟ�ɫ�ɞɚɧɧɵɦɢ�ɩɭɫɬɨ. Ɂɚɩɨɥɧɢɬɟ�ɟɝɨ, ɡɚɩɭɫɬɢɬɟ�ɩɪɨɟɤɬ�ɟɳɟ�ɪɚɡ") End End If

Page 49: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 48

Для сортировки в VB.Net существует встроенная подпрограмма Array.Sort(), сортирующая массив в возрастающем порядке. Например:

Array.Sort(Arr) Встроенная подпрограмма Array.Reverse() сортирует массив по убыванию.

6. Получим следующий код процедуры: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim Arr() As Single Ɉɛɴɹɜɥɹɟɦ�ɩɭɫɬɨɣ�ɦɚɫɫɢɜ Dim n As Integer ' ɨɩɪɟɞɟɥɹɟɦ�ɱɢɫɥɨ�ɫɬɪɨɤ�ɬɟɤɫɬɨɜɨɝɨ�ɩɨɥɹ n = TextBox1.Lines.Length If n <= 0 Then MsgBox(�ɉɨɥɟ�ɫ�ɞɚɧɧɵɦɢ�ɩɭɫɬɨ. Ɂɚɩɨɥɧɢɬɟ�ɟɝɨ�ɢ�ɡɚɩɭɫɬɢɬɟ�ɩɪɨɟɤɬ�ɟɳɟ�ɪɚɡ") : End End If ' Ɂɚɞɚɟɦ�ɪɚɡɦɟɪ�ɦɚɫɫɢɜɚ Arr ɜ�ɡɚɜɢɦɫɦɨɫɬɢ�ɨɬ�ɤɨɥɢɱɟɫɬɜɚ�ɫɬɪɨɤ�ɩɨɥɹ ReDim Arr(n - 1) Ɂɚɩɪɨɥɧɹɟɦ�ɦɚɫɫɢɜ�ɞɚɧɧɵɦɢ�ɢɡ�ɬɟɤɫɬɨɜɨɝɨ�ɩɨɥɹ For i = 0 To n - 1 Arr(i) = Val(TextBox1.Lines(i)) Next ɋɨɪɬɢɪɭɟɦ�ɦɚɫɫɢɜ Arr Array.Sort(Arr) If CheckBox1.Checked = True Then ' ȿɫɥɢ�ɮɥɚɠɨɤ�ɭɫɬɚɧɨɜɥɟɧ, ɬɨ ɋɨɪɬɢɪɭɟɦ�ɦɚɫɫɢɜ Arr ɜ�ɨɛɪɚɬɧɨɦ�ɩɨɪɹɞɤɟ Array.Reverse(Arr) End If TextBox2.Clear() ɨɱɢɳɚɟɦ�ɬɟɤɫɬɨɜɨɟ�ɩɨɥɟ�ɪɟɡɭɥɶɬɚɬɚ�ɫɨɪɬɢɪɨɜɤɢ TextBox2.BackColor = Color.Aqua ɜɵɜɨɞɢɦ�ɦɚɫɫɢɜ Arr ɜɨ�ɜɬɨɪɨɟ�ɬɟɤɫɬɨɜɨɟ�ɩɨɥɟ For i = 0 To n - 1 TextBox2.Text = TextBox2.Text & Arr(i) & vbNewLine Next End Sub 7. Добавьте в код команду:

TextBox2.BackColor = Color.Aqua 8. Введите свой набор цифр в первое многострочное текстовое поле. Щелките кнопку Отобразить.

Page 50: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 49

9. Проанализируйте полученные результаты. Покажите результаты учителю. 10. Сохраните обновленную версию проекта. 11. Закройте окно выполнения проекта. 12. Закройте окно среды VB.Net.

ɋɨɪɬɢɪɨɜɤɚ�ɷɥɟɦɟɧɬɨɜ�ɫɬɪɨɤɨɜɨɝɨ (ɬɟɤɫɬɨɜɨɝɨ) ɦɚɫɫɢɜɚ Одним из наиболее частых приложений алгоритмов сортировки является сортировка тексто-

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

Применение данного метода к строкам, представляющим собой числа в естественной записи, выдаёт неожиданные результаты: например, «9» оказывается больше, чем «11», так как первый символ первой строки имеет большее значение, чем первый символ второй. Для исправления этой проблемы алгоритм сортировки может преобразовывать сортируемые строки в числа и сор-тировать их как числа. Такой алгоритм называется «числовой сортировкой», а описанный вы-ше — «строковой (текстовой) сортировкой».

ɋɨɪɬɢɪɨɜɤɚ�ɬɟɤɫɬɨɜɵɯ�ɦɚɫɫɢɜɨɜ�ɉɪɨɟɤɬ SortMy

Создайте проект Фамилия_SortMy, в котором в алфавитном порядке сортируется набор слов, введен-ный в многострочное текстовое поле Textbox1 на этапе конструирования формы. Вывод осуществите в список Listbox.

1. Откройте окно среды VB.Net. 2. Разместите не форме 2 многострочных тексто-

вых поля с параметрами Multiline = true и ScrollBars = Vertical. Поместите на форму 2 надписи и кнопку, а также флажок CheckBox1. Занесите соответствующие названия в текстах этих элементов.

Для ввода слов в многострочное текстовое поле воспользуйтесь редактором строк, который можно от-крыть, выбрав в окне свойств поля справа от свойства Lines кнопку в конце строки String[]Array.

3. Создайте код процедуры обработчика щелчка кнопки. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' ɨɛɴɹɜɥɹɟɦ�ɬɟɤɫɬɨɜɵɣ�ɦɚɫɫɢɜ Dim st(20) As String Dim i, n As Integer ' ɨɩɪɟɞɟɥɹɟɦ�ɱɢɫɥɨ�ɫɬɪɨɤ�ɬɟɤɫɬɨɜɨɝɨ�ɩɨɥɹ Textbox1 n = TextBox1.Lines.Length ɗɚɩɪɨɥɧɹɟɦ�ɦɚɫɫɢɜ�ɞɚɧɧɵɦɢ�ɢɡ�ɬɟɤɫɬɨɜɨɝɨ�ɩɨɥɹ Dim sep_arr() As Char = {} st = TextBox1.Text.Split(sep_arr, StringSplitOptions.RemoveEmptyEntries) ɋɨɪɬɢɪɭɟɦ�ɦɚɫɫɢɜ st Array.Sort(st) ' ȿɫɥɢ�ɮɥɚɠɨɤ�ɭɫɬɚɧɨɜɥɟɧ, ɬɨ If CheckBox1.Checked = True Then ɋɨɪɬɢɪɭɟɦ�ɦɚɫɫɢɜ st ɜ�ɨɛɪɚɬɧɨɦ�ɩɨɪɹɞɤɟ Array.Reverse(st) End If

Page 51: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 50

' ɨɱɢɳɚɟɦ�ɩɨɥɟ ListBox1 ListBox1.Items.Clear() ȼɵɜɨɞɢɦ�ɨɬɫɨɪɬɢɪɨɜɚɧɧɵɣ�ɦɚɫɫɢɜ�ɜ�ɩɨɥɟ ListBox1 For i = 0 To n - 1 ListBox1.Items.Add(st(i)) Next End Sub 4. Запустите проект на выполнение. Выполните сортировку по алфавиту и в обратном порядке. Проанализируйте работу проекта. 5. Введите свой набор названий чисел в первое многострочное текстовое поле. Выберите кнопку Отобразить. Проанализируйте полученные результаты. 6. Покажите результаты учителю. 7. Сохраните проект в папке Фамилия_6.4. 8. Закройте окно выполнения проекта. 9. Закройте окно среды VB.Net.

ɉɨɢɫɤ�ɡɧɚɱɟɧɢɹ�ɜ�ɨɬɫɨɪɬɢɪɨɜɚɧɧɨɦ�ɦɚɫɫɢɜɟ Рассмотрим алгоритм поиска в отсортированном массиве методом половинного деления. Для того, чтобы найти определенное значение в неупорядоченном массиве, придется пере-

сматривать все его элементы. В отсортированном массиве это можно сделать значительно быстрее. Слово «школа» нет смысла искать в начале словаря, потому что в любом словаре слова рас-

положены в алфавитном порядке (слова, которые начинаются на букву «ш», содержатся ближе к концу).

Это же можно сказать и о числовых отсортированных массивах. Вспомним массив, который мы отсортировали: 1 3 4 6 8 10 12 Найдем в этом массиве число 4, стремясь выполнить как можно меньше шагов. Разделим

массив пополам. В середине массива стоит число 6. Где может размещаться число 4 относительно 6, справа

или слева? Понятно, что только слева! На этом и основывается поиск. Итак, выяснив, что число 4 размещено в левой части массива, ограничиваем поиск этой ча-

стью: 1 3 4 6 Средним индексом элементов этого массива будет 1,5 (не забывайте, что нумерацию необхо-

димо начинать с 0). Округляем индекс к меньшему значению, поскольку дробных индексов не бывает. Следова-

тельно, серединой массива является число 3. Поскольку 4 > 3, то ограничиваем поиск правой частью массива: 3 4 6 Средним в этом массиве будет элемент 4. Результат получен!

ɉɪɨɟɤɬ BinarySearch Создайте новый проект Фамилия_BinarySearch. Разработайте форму, как на рисунке. По щелчку кнопки Заповнити должен создаваться массив, запол-

ненный отсортированными значениями. Искомое значение должно вводится в текстовое поле TextBox1. По щелчку кнопки Пошук осуществляется поиск порядкового

номера того элемента массива, который совпадает с искомым значе-нием.

Результат поиска должен отображаться в форме сообщения.

Page 52: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 51

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

Dim Array(10) As Integer Код кнопки Заповнити сформируем так: Заполним массив по формуле Dim i As Integer For i = 1 To 10 array(i) = 2*i - 1 Next Потом очистим поле со списком ListBox1 и выведем в него массив: ListBox1.Items.Clear() For i = 0 To 10 ListBox1.Items.Add(Str(Array(i))) Next Процедура поиска в массиве может быть записана следующим образом:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim up As Integer = UBound(Array) ɜɟɪɯɧɢɣ�ɩɪɟɞɟɥ Dim down As Integer = LBound(Array) ɧɢɠɧɢɣ�ɩɪɟɞɟɥ Dim tmp As Integer ɜɪɟɦɟɧɧɚɹ�ɩɟɪɟɦɟɧɧɚɹ�ɞɥɹ�ɫɪɟɞɧɟɝɨ�ɢɧɞɟɤɫɚ Dim what As Integer = Val(TextBox1.Text) ɢɫɤɨɦɨɟ�ɡɧɚɱɟɧɢɟ Dim found As Integer = -1 ɩɟɪɟɦɟɧɧɚɹ, ɨɩɪɟɞɟɥɹɸɳɚɹ�ɢɧɞɟɤɫ�ɢɫɤɨɦɨɝɨ�ɷɥɟɦɟɧɬɚ ‘ɢɥɢ�ɪɟɡɭɥɶɬɚɬ�ɡɚɜɟɪɲɟɧɢɹ�ɩɨɢɫɤɚ While found = -1 ɩɨɤɚ found = –1, ɨɫɭɳɟɫɬɜɥɹɟɦ�ɩɨɢɫɤ tmp = (up + down) / 2 ɨɩɪɟɞɟɥɹɟɦ�ɫɟɪɟɞɢɧɭ If Array(tmp) > what Then ɜɵɛɨɪ�ɨɛɥɚɫɬɢ�ɫ�ɢɫɤɨɦɵɦ�ɷɥɟɦɟɧɬɨɦ up = tmp - 1 Else down = tmp + 1 End If If up < down Then ɟɫɥɢ�ɩɪɚɜɵɣ�ɩɪɟɞɟɥ «ɡɚɫɤɨɱɢɥ» ɡɚ�ɥɟɜɵɣ, ɬɨ If Array(up) = what Then ɢɥɢ�ɡɧɚɱɟɧɢɟ�ɧɚɣɞɟɧɨ found = up Else ɢɥɢ�ɟɝɨ�ɜ�ɦɚɫɫɢɜɟ�ɧɟɬ found = -2 End If End If End While ɨɛɪɚɛɨɬɤɚ�ɪɟɡɭɥɶɬɚɬɚ If found <> -2 Then MsgBox(�ɡɧɚɣɞɟɧɨ�ɧɚ" + Str(found) + "-ɣ�ɩɨɡɢɰɿʀ") Else MsgBox(�ɧɟ�ɡɧɚɣɞɟɧɨ") End If End Sub

Page 53: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 52

Бинарный поиск (метод половинного деления), который мы только что запрограммировали, реализован во встроенной функции Array.BinarySearch().

Не забывайте, что бинарный поиск происходит на уже отсортированном массиве, поэтому перед его запуском массив необходимо отсортировать.

Например: Dim Arr() As Integer = {1, 6, 3, 9, 2, 7, 10, 5, 8, 12} Dim what As Integer = 10 'ɢɫɤɨɦɨɟ�ɡɧɚɱɟɧɢɟ Array.Sort(Arr) ‘ ɫɨɪɬɢɪɭɟɦ�ɦɚɫɫɢɜ MsgBox(str(what) +" is on "+Str(Array.BinarySearch(Arr, what))) Массив в упорядоченном виде будет: 1 2 3 5 6 7 8 9 10 12 Поиска, быстрее бинарного, не существует. Оказывается, алгоритм бинарного поиска люди выдумали задолго до появления компьюте-

ров, тогда, когда изобрели первый словарь. Кстати, в древнем мире были изобретены и многие другие алгоритмы. Этого не скажешь об алгоритме сортировки пузырьком, который мы изучали.

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

ɉɨɢɫɤ�ɡɧɚɱɟɧɢɹ�ɜ�ɬɟɤɫɬɨɜɨɦ�ɦɚɫɫɢɜɟ Функция а.IndexOf (b, n) дает число - позицию вхождения строки b в строку а, начиная с по-

зиции n. Например, IndexOf ("ф", 0). Эту функцию удобно использовать для поиска в массиве текстовых элементов. Создадим проект Фамилия_поиск_строки, в котором сравним поиск текстовой строки в

массиве с помощью двух встроенных функций: Array.BinarySearch и Array.IndexOf Создадим форму, как на рисунке. В конструкторе грида построим коллекцию столб-

цов, которые подпишем «0», «1», «2», ..., «6» и зададим свойству AutoSizeColumnxMode значение Fill. Выберем в свойстве грида ColumnHeadersDefaultCell-Style значения DataGridViewCellStyle: BackColor светло-оранжевый, Alignment=TopCenter

Создайте программный код проекта. Объявите массив как глобальную переменную. Создайте проце-дуры событий загрузки формы и щелчка кнопки:

Page 54: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 53

Запустите проект на выполнение. Выполните сравнительный анализ: совпадают ли результаты выполнения поиска с примене-

нием обеих функций, и если они не совпадают, то объясните почему.

Ⱦɥɹ ɬɟɯ, ɤɬɨ�ɯɨɱɟɬ�ɡɧɚɬɶ�ɛɨɥɶɲɟ

ɋɨɪɬɢɪɨɜɤɚ�ɩɨɞɫɱɺɬɨɦ Сортировка подсчётом (черпачная) — алгоритм сортировки, в котором используется диапазон чисел сортируемого массива для подсчёта совпадающих элементов. Применение сортировки подсчётом целесообразно лишь тогда, когда сортируемые числа имеют (или их можно отобра-зить в) диапазон возможных значений, который достаточно мал по сравнению с сортируемым множеством, например, миллион натуральных чисел меньших 1000.

Идея метода – основана на подсчете для каждого элемента количества элементов массива, меньших

данного; – от этого количества зависит номер каждого элемента в новом массиве, т. е. если 5 эле-

ментов меньше данного, то его место в новом массиве будет 6-ым (при сортировке по возрастанию).

ɋɨɪɬɢɪɨɜɤɚ�ɫɥɢɹɧɢɟɦ Сортировка слиянием - это алгоритм сортировки, который упорядочивает списки, доступ

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

станет длиной в один элемент. Затем эти участки возвращаются на место (сливаются) в правиль-ном порядке.

Эта сортировка — пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи ре-

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

Ȼɵɫɬɪɚɹ�ɫɨɪɬɢɪɨɜɤɚ Быстрая сортировка — алгоритм сортировки, разработанный английским информатиком

Чарльзом Хоаром. Один из самых быстрых известных универсальных алгоритмов сортировки массивов.

Page 55: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 54

Быстрая сортировка — это также алгоритм типа «разделяй и властвуй». Он работает, рекур-сивно повторяя следующие шаги:

– Выбрать ключевой индекс и разделить по нему массив на две части. Это можно делать разными способами, но мы используем случайное число.

– Переместить все элементы больше ключевого в правую часть массива, а все элементы меньше ключевого — в левую. Теперь ключевой элемент находится в правильной пози-ции — он больше любого элемента слева и меньше любого элемента справа.

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

ȿɳɟ�ɫɨɪɬɢɪɨɜɤɢ Гномья сортировка — алгоритм сортировки, похожий на сортировку вставками, но перед

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

Вот как он описывает гномью сортировку в своих работах: Гномья сортировка основана на технике, используемой обычным голландским садовым гно-

мом. Это метод, которым садовый гном сортирует линию цветочных горшков. Он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперед, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперед; если нет следующего горшка, он закончил.

Сортировка Шелла — модификация сортировки вставками, сортируются между собой эле-менты, стоящие на кратных выбранному шагу местах.

Сортировка кучей (пирамидальная сортировка) — алгоритм сортировки, использующий структуру данных двоичная куча. Может рассматриваться как усовершенствованная сортировка пузырьком, в которой элемент всплывает/тонет по многим путям.

Сортировка расчёской является модификацией пузырьковой. Ʉɥɚɫɫɢɮɢɤɚɰɢɹ�ɫɨɪɬɢɪɨɜɨɤ

Согласно сайту http://ermak.cs.nstu.ru/cprog/html/046.htm

Ⱦɨɦɚɲɧɟɟ�ɡɚɞɚɧɢɟ Учить в пособии урок 6.4. Выполнить следующие задания:

Page 56: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 55

Ɋɚɛɨɬɚɟɦ�ɫ�ɤɨɦɩɶɸɬɟɪɨɦ Внимание! Во время работы с компьютером соблюдайте правила безопасности и санитар-но-гигиенические нормы. Выполните на ПК проекты для задач, изложенных в теории: – Задача 1. Создайте проект Фамилия_Sort. – Задача 2. Создайте проект Фамилия_Sort2 с использованием стандартных функций. – Задача 3. Создайте проект Фамилия_BinarySearch с использованием стан-дартных функ-

ций. – Создайте проекты, использующие встроенные функции:

ü Фамилия_SortMy, ü Фамилия_BinarySearch, ü Фамилия_поиск_строки.

ɋɚɦɨɟ�ɜɚɠɧɨɟ�ɜ�ɷɬɨɦ�ɩɭɧɤɬɟ Сортировка элементов массива - это процесс перестановки элементов с целью упорядочения их по некоторому признаку. Методов сортировки массивов существует множество:

– сортировка обменом – «пузырьковая» – сортировка выбором – сортировка вставками – сортировка подсчетом – Гномья сортировка – сортировка расческой – сортировка Шелла – сортировка слиянием – Быстрая сортировка – сортировка кучей (пирамидальная) – и другие.

При работе с массивами удобно для ввода массива использовать многострочное текстовое по-ле, а для вывода – список ListBox. Для сортировки в VB.Net существует встроенная функция Array.Sort(), сортирующая массив в возрастающем порядке. Например: Array.Sort(Arr)

Встроенная функция Array.Reverse() сортирует массив по убыванию. Одним из наиболее частых приложений алгоритмов сортировки является сортировка строк. Обычно она выполняется так: сначала множество строк сортируется по первому символу ка-ждой строки, затем каждое подмножество строк, имеющих одинаковый первый символ, сор-тируется по второму символу, и так до тех пор, пока все строки не будут упорядочены. Бинарный поиск реализован во встроенной функции Array.BinarySearch() Поиска, быстрее бинарного, не существует.

Ⱦɚɣɬɟ�ɨɬɜɟɬɵ�ɧɚ�ɜɨɩɪɨɫɵ 1. В чем заключается суть сортировки методом выбора минимального элемента? 2. В чем заключается суть сортировки методом обмена (пузырьковой)? 3. Где может находиться самый большой элемент массива, если массив не упорядочен? 4. Где может находиться наименьший элемент массива, если массив сортируются по возрас-танию; по убыванию? 5. Какая встроенная стандартная подпрограмма в VB.Net сортирует массив в возрастающем порядке? Какая подпрограмма сортирует массив по убыванию?

Page 57: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 56

6. В чем заключается особенность сортировки массива текстовых строк? 7. В чем заключается суть бинарного поиска и в какой встроенной функции он реализован?

Ɋɚɡɝɚɞɚɣɬɟ�ɪɟɛɭɫɵ

Page 58: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 57

6.5 Функции. Процедуры ȼɨɩɪɨɫɵ 1. Что является событием? 2. Что такое обработчик события и каков его синтаксис? 3. Какие стандартные функции вам известны?

ɉɨɞɩɪɨɝɪɚɦɦɵ Подпрограмма – это код, который имеет собственное название, записывается отдельно от ос-

новного кода, его можно использовать один или много раз с целью решения некоторой подзада-чи.

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

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

сами данные — аргументами. Подпрограммы – это своеобразные мини-программы. Их назначение – выполнять конкретные задания в большой программе. При написании про-

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

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

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

В подпрограммах могут использоваться другие подпрограммы. Подпрограммы — это также средство распределения работы по созданию большой приклад-

ной программы. Отдельным программистам дают задание написать определенный набор подпрограмм для

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

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

Создание подпрограмм похоже на разработку форм. Так как подпрограммы похожи на не-большие программки, они могут содержать любые операторы.

В языке Бейсик различают два вида подпрограмм: нестандартные функции (функции поль-зователя) и процедуры.

ɋɬɚɧɞɚɪɬɧɵɟ�ɢ�ɧɟɫɬɚɧɞɚɪɬɧɵɟ�ɮɭɧɤɰɢɢ Главное отличие между подпрограммами и функциями состоит в том, что из функций можно

получать данные. Их называют возвращаемыми значениями. Функция возвращает значение определенного типа.

Все функции делятся на стандартные и нестандартные. При использовании стандартной функции необходимо указывать класс Math, к которому

функция принадлежит.

Page 59: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 58

Например: L1 = Math.Sqrt ((x2 - x1) ^ 2 + (y2 - y1) ^ 2) Правило. Между именем функции и скобками с аргументами НЕ может стоять никакой

знак: Sin^2(x) – неправильно, а Sin(x)^2 – правильно. Если функций в коде используется много, чтобы не указывать каждый раз Math., можно в

коде программы над строкой Public Class Form1 указать строку импорта класса System.Math: Imports System.Math Стандартные математические функции VB.Net приведены в таблице.

Функция Описание Abs Возвращает абсолютное значение (модуль) заданного числа.

Atan Возвращает значение типа Double, содержащее угол, значение тангенса кото-рого равно заданному числу.

Cos Возвращает значение типа Double, содержащее косинус заданного угла.

Exp Возвращает значение типа Double, содержащее число e (основание натураль-ных логарифмов) в заданной степени.

Log Возвращает значение типа Double, содержащее логарифм заданного числа. Этот метод может возвращать как натуральный логарифм заданного числа (по основанию e), так и логарифм числа по заданному основанию.

Round Возвращает значение типа Double, содержащее ближайшее к заданному значе-нию. Дополнительные функции округления доступны в качестве методов встроенных типов, например, Round.

Sign Возвращает значение типа Integer, показывающее знак числа. Sin Возвращает значение типа Double, определяющее синус угла. Sqrt Возвращает значение типа Double, определяющее квадратный корень числа. Tan Возвращает значение типа Double, содержащее тангенс угла.

Рассмотрите стандартные функции sin(x), cos(x+3.14), Sqrt(x^2+y^2). Такие выражения называют указателями функций. Указатель функции не является коман-

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

среды). Каркас .NET Framework содержит много встроенных подпрограмм и функций, которые пред-

назначены для выполнения часто встречающихся задач. Эти функции были тщательным образом проверены и настроены. Их можно использовать во всех языках семьи .NET. Если есть такая возможность, применяйте именно эти функции, вместо того, чтобы писать собственные. ɋɨɡɞɚɧɢɟ�ɮɭɧɤɰɢɣ�ɩɨɥɶɡɨɜɚɬɟɥɹ

Пользователь может создавать свои собственные функции, например, для вычисления выра-жений. Их называют нестандартными функциями (функциями пользователя). Нестандартную функцию используют так же, как и стандартную.

Функция может возвращать в точку вызова только один результат простого типа. Нестандартную функцию надо описывать. Для описания нестандартной арифметической

функции используют такую конструкцию: FUNCTION <ɢɦɹ> (<ɫɩɢɫɨɤ�ɮɨɪɦɚɥɶɧɵɯ�ɩɚɪɚɦɟɬɪɨɜ>) <ɫɟɪɢɹ�ɤɨɦɚɧɞ> <ɢɦɹ> = <ɜɵɪɚɠɟɧɢɟ> END FUNCTION Здесь Function и End Function - это ключевые слова. Первую строку называют заголовком.

Имя для функции придумывает пользователь, оно не должно совпадать с названием какой-либо переменной в коде.

Вместо строки <имя> = <выражение> можно писать Return (<выражение>)

Page 60: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 59

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

В арифметическом выражении могут быть переменные, константы, другие функции. Чаще всего функции описывают в начале программы.

К функции обращаются (функцию вызывают) из главного кода с помощью оператора, кото-рый имеет такой общий вид:

�ɂɦɹ�ɮɭɧɤɰɢɢ> (<ɫɩɢɫɨɤ�ɮɚɤɬɢɱɟɫɤɢɯ�ɩɚɪɚɦɟɬɪɨɜ�ɮɭɧɤɰɢɢ>) Фактические параметры - это параметры, которые используются в указателе функции. Фак-тическим параметром может быть константа или переменная, арифметическое выражение или указатель другой функции. Указатели нестандартных функций используют в арифмети-ческих выражениях как операнды. Взаимодействие указателя и описания функции:

– В момент вызова функции значения фактических параметров подставляются в описа-нии функции на место соответствующих формальных параметров.

– После этого выполняются вычисления внутри функции и результат возвращается ука-зателю в точку вызова.

В описании функции формальные параметры, предназначенные для получения данных из главного кода, записывают со словом ByVal перед параметром. Такая передача данных рабо-тает односторонне: передает данные из оператора вызова функции в описание этой функции.

ɋɨɡɞɚɧɢɟ�ɮɭɧɤɰɢɣ�ɩɨɥɶɡɨɜɚɬɟɥɹ. Ɂɚɞɚɱɚ 1 Задача 1. Для сложения трех цифр создать функцию и применить ее при вычислении неко-

торого выражения. Решение. Рассмотрим описание искомой функции под названием dodaty и тремя формаль-

ными параметрами ɚ, b, ɫ: Function dodaty (a, b, ɫ) dodaty = ɚ + b + ɫ End Function Функция сама не выполняется. Ее надо вызвать из другого кода, который называют главным

относительно функции, с помощью указателя, например, dodaty (1, 2, 3) где 1, 2, 3 - фактические параметры. Значением этого указателя будет число 6. Рассмотрим, как применяют функции. Выясним, какое значение получит переменная z после

вычисления выражения в таком главном коде Dim ɯ, z ɯ = 2 z = 7 + dodaty (x, 5, 2 * 3) MsgBox(z) Здесь в списке фактических параметров в dodaty (x, 5, 2 * 3) есть переменная х, константа 5

и выражение 2 * 3. Выполним главный код и получим результат: z = 20. Опишем этот процесс. Если в арифметическом выражении есть указатель функции, то сис-

тема выполняет такой алгоритм: 1) вычисляет значение фактических параметров (здесь они будут 2, 5 и 6 соответственно); 2) обращается к описанию заданной функции: Function dodaty (a, b, с); 3) передает параметрам функции значения соответствующих фактических параметров (здесь

ɚ получит значение 2, b получит 5, ɫ получит значение 6); 4) выполняет команды, описанные в функции, в частности, вычисляет результат, который

присваивается имени функции (здесь dodaty получит значение 13);

ɋɢɫɬɟɦɚ�ɚɜɬɨɦɚɬɢɱɟɫɤɢ�ɞɨɛɚɜɢɬ�ɨɩɢɫɚɧɢɟ�ɩɚɪɚɦɟɬɪɨɜ: Function dodaty(ByVal a, ByVal b, ByVal ɫ)

Page 61: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 60

5) передает результат (13) в точку вызова в выражение, говорят «присваивает результат ука-зателю» (в выражении для z указатель dodaty (x, 5, 2 * 3) получит значение 13);

6) продолжает вычисления конкретного арифметического выражения (здесь переменная z получит значение 7 + 13, то есть 20, что и нужно было выяснить).

Замечание 1. Имена соответствующих формальных и фактических параметров могут отли-

чаться друг от друга. Важен их порядок. Замечание 2. Количество и типы параметров в соответствующих списках должны быть оди-

наковыми. Ɂɚɞɚɱɚ 2. Ƚɢɩɨɬɟɧɭɡɚ

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

Решение. Предоставим функции название gipotenuza. Проанализируем, сколько эта функция будет иметь параметров. Из условия задачи следует, что два - значения длин двух катетов. Итак, описание функции, записанное под строкой программы Public Class Form1, будет выглядеть так:

Function gipotenuza(ByVal a As Single, ByVal b As Single) gipotenuza = Math.Sqrt(a ^ 2 + b ^ 2) End Function Теперь составим главный код событийной процедуры Button1_Click, который будет выпол-

няться первым. Dim a As Single, b As Single, c As Single a = InputBox("Bɜɟɞɢɬɟ�ɞɥɢɧɭ�ɩɟɪɜɨɝɨ�ɤɚɬɟɬɚ") b = InputBox(" Bɜɟɞɢɬɟ�ɞɥɢɧɭ�ɜɬɨɪɨɝɨ�ɤɚɬɟɬɚ") c = gipotenuza(a, b)*100 MsgBox(c) Этот код является главным относительно функции gipotenuza. Проанализируем, как главный код взаимодействует с функцией. Во время выполнения кода переменным ɚ и b предоставим некоторые значения, пусть 3 и 4. Начнет вычисляться выражение для переменной с и сразу произойдет вызов функции. Число 3 будет передано первому формальному параметру, а число 4 – второму. Переменная

gipotenuza, которая является именем функции, получит значение 5. Это значение возвратится в точку вызова в выражение и переменная ɫ получит значение 100 * 5, то есть 500.

Function dodaty (a, b, с) dodaty = а + b + с End Function Dim х, z х = 2 z = 7 + dodaty (x, 5, 2 * 3) MsgBox(z)

Page 62: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 61

Ɂɚɞɚɱɚ 3. ȼɵɱɢɫɥɢɬɶ�ɡɧɚɱɟɧɢɟ�ɮɭɧɤɰɢɣ�ɭ = ɯ3 - ɯ2 + 3 ɢ�ɭ = ɯ4 - 2ɯ2 + 5 Задача 3. Вычислить значение функции у = х3 - х2 + 3 в точке х = 3. Вычислить значение функции у = х4 - 2х2 + 5 в точке х = 4.

Решение. Первую функцию назовем ɭ: Function ɭ�ɯ) y = ɯ^3-ɯ^2+3 End Function

Вторую функцию назовем ɭ1: Function ɭ1(ɯ) ɭ1 = ɯ^4-2*ɯ^2 + 5 End Function

Тогда главный код будет выглядеть так: Dim x As Single, x1 As Single x = Val(InputBox(" ȼɜɟɞɢɬɟ x")) MsgBox(y(x)) x1 = Val(InputBox("ȼɜɟɞɢɬɟ x1")) MsgBox(y1(x1))

Выполнив этот код для х = 3 и х1 = 4, получим такие 2 результата: 21 и 229. Ɂɚɞɚɱɚ 4. ȼɵɱɢɫɥɟɧɢɟ n!

В общем случае формальные параметры принято перечислять с указанием их типов. Указывают также и тип указателя функции. Например, в задаче 3 вместо заголовка Function y (ByVal х) надо писать так:

Function y (ByVal х As Single) As Single. Задача 4. Вычислить n! (факториал числа n), где n - неотрицательное число. Известно, что 0! = 1, 1! = 1, n! = n·(n - 1)!. Получается формула n! = 1·2·3 …·n. Итак, задача вычисления факториала сводится к задаче вычисления произведения. Рассмот-

рим соответствующую функцию под названием Factorial, которую можно использовать для ре-шения различных задач.

Function Factorial (ByVal n As Integer) As Integer Dim p As Integer Factorial = 1 If n > 0 Then For p = 1 To n Factorial = p * Factorial Next End If End Function

Почему эту функцию нельзя использовать, чтобы вычис-лить значение 15! ? (Ответ: результат выходит за пределы типа integer). Заголовок функции нужно переделать так:

function Factorial ((n as integer) as long Создайте проект Фамилия_Факториал. Сконструируйте форму, как на рисунке. Добавьте командную кнопку «Показать». В гриде DataGridView1 добавьте 2 столбца с заголовками

n и n!. В режиме редактирования грида для первого столбца задайте свойству AutoSizeMode значение AllCells, а для вто-рого столбца – Fill. Первый столбец будет нешироким, зато во второй будут выводиться большие целые числа.

Page 63: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 62

В коде программы после строки Public Class Form1 запишите функцию Factorial с типом long. В обработчике события выбора кнопки «Показать» запишите код заполнения грида значе-

ниями n! для n от 0 до 15: Dim i, j As Integer For i = 0 To 15 DataGridView1.Rows.Add(1) DataGridView1.Rows(i).Cells(0).Value = i DataGridView1.Rows(i).Cells(1).Value = Factorial(i) Next Запустите проект на выполнение. Убедитесь, что 7! будет иметь значение 5040. Покажите работу учителю. Измените код для значений i от 0 до 20. Что произойдет? Сохраните измененный проект. Завершите работу с проектом. Функцию для вычисления факториала применяют при решении задач по комбинаторике. Чтобы найти число всех перестановок множества из n предметов – например, число спосо-

бов, которыми можно расставить n томов на книжной полке, используют формулу Pn = n (n – 1) (n – 2) ... ∙ 3 ∙ 2 ∙ 1.

Для определения количества всех возможных комбинаций из m предметов в группе n воз-можных используют формулу

Пример. Двух учеников среди десяти можно выбрать столькими способами: С2

10 = 10! / (2! · 8!) = 10 · 9 · 8! / (2 · 1 · 8!) = 90/2 = 45. ȿɳɟ�ɨɛ�ɨɛɴɹɜɥɟɧɢɢ�ɮɨɪɦɚɥɶɧɵɯ�ɩɚɪɚɦɟɬɪɨɜ Можно НЕ описывать конкретные числовые типы параметров указателя функции? Да, мож-

но, но это делать не рекомендуется. Обычно это к ошибкам не приводит. Код будет компактнее, но пользователь будет нести от-

ветственность за возможное несоответствие типов между фактическими и соответствующими формальными параметрами, что может привести к ошибкам в больших кодах.

Функция может возвращать значение не только через имя-указатель, но и через параметр - результат.

Тогда заголовок вида Function у (х, х1, у1), где х и х1 - аргументы, а у1 – некоторый допол-нительный результат, надо писать так:

Function y (ByVal х, ByVal х1, ByRef у1) Традиционно, если подпрограмма возвращает более одного результата, то принято приме-

нять процедуры, а не функции. ɂɬɨɝɢ. ȼɨɩɪɨɫɵ�ɢ�ɡɚɞɚɧɢɹ

В массовых программах не принято делать изменения в главных кодах, если входные данные меняются.

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

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

Ⱦɚɣɬɟ�ɨɬɜɟɬɵ�ɧɚ�ɜɨɩɪɨɫɵ 1. Для чего нужны функции пользователя? 2. Какие стандартные функции вы знаете? 3. В чем разница между стандартной функцией и функцией пользователя? 4. Каков синтаксис подпрограммы-функции?

)!(!!

mnmnCm

n -×=

Page 64: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 63

5. Кто составляет и предоставляет названия нестандартным функциям? 6. Каков синтаксис вызова функции пользователя? 7. Для чего используют формальные и фактические параметры? 8. Сколько значений возвращает как результат функция пользователя? 9. Может быть функция без параметров? (Ответ: да, данные передаются в функцию через

глобальные переменные).

ɋɚɦɨɟ�ɝɥɚɜɧɨɟ�ɜ�ɷɬɨɦ�ɩɭɧɤɬɟ ɋɢɧɬɚɤɫɢɫ функции пользователя, которая имеет параметры и возвращаемое значение: Private Function ИмяФункции (ByVal имяПараметра1 As типПараметра1, ByVal имяПараметра2

As типПараметра2, ByVal имяПараметраN As типПараметраN) As ТипВозвращаемогоЗначения оператор 1 оператор 2 . . . . . . . . . . . оператор N ИмяФункции = ВозвращаемоеЗначение End Function При создании функции пользователя необходимо указывать тип возвращаемого значения. Ключевое слово Privat можно не указывать. По умолчанию система сама будет считать

функцию как Privat. Слова Private, Function, ByVal, As и End Function являются ключевыми. Имя функции должно быть описательным. Список параметров и их типов записывается в круглых скобках после имени функции. Параметры разделяются запятыми. Количество параметров может быть произвольным, но возвращаемое значение может быть

только одно. Нужно указывать тип этого значения, например As Integer или As String, после скобок в заго-

ловке функции. Возвращаемое значение присваивается имени функции в последней строке кода функции. ȼɵɡɨɜ�ɮɭɧɤɰɢɢ имеет вид:

�ɂɦɹ�ɮɭɧɤɰɢɢ> (<ɫɩɢɫɨɤ�ɮɚɤɬɢɱɟɫɤɢɯ�ɩɚɪɚɦɟɬɪɨɜ�ɮɭɧɤɰɢɢ>) Количество формальных и фактических параметров должно совпадать.

Ⱦɨɦɚɲɧɟɟ�ɡɚɞɚɧɢɟ Учить в пособии урок 6.5. Выполнить упражнения.

ȼɵɩɨɥɧɢɬɟ�ɭɩɪɚɠɧɟɧɢɹ 1. Задана функция: Function Mynumber(a, b) Mynumber = a + 2 * b End Function

Вычислите устно: a) Mynumber (3, 4); б) 5 * Mynumber (2, 3); в) Mynumber (4, 2) + Mynumber (5, -2); r) Mynumber (3, 3)^2 2. Задана функция: Function Start(a, b, c) If a > b Then Start = a Else Start = c End Function

Вычислите: a) Start(1, 2, 3); б) Start(2, 1, 3); в) Start(1 + 3, 2 + 3, 3 + 3); г) Start(1, 2, Start(3, 2, 5)). 3. Рассмотрите функцию y(x):

Page 65: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 64

Function y(x) ɭ = ɯ^2-5*ɯ + 6 End Function

Какое значение получат: a) y(2); б) y(5); в) y(4) — y(1)? 4. Напишите функцию для: а) добавление четырех заданных чисел; б) вычисления среднего арифметического трех заданных чисел; в) вычисление площади круга по известному радиусу; г) вычисление объема шара с известным радиусом; д) определение минимального из двух заданных чисел; е) перевода в доллары по курсу Нацбанка. е) перевод морских миль в километры, если 1 миля = 1,609344 км. Запишите выражение, чтобы определить, сколько километров имеют три мили? 5. Используя функцию dniv из задачи 4, запишите выражение, чтобы определить количество дней в марте, апреле и мае (весной) вместе. 6. Выясните, какие фрагменты повторяются в следующем выражении, создайте и примените для их вычисления функции пользователя с именем myfun: 7*. Запишите функцию для вычисления минимального значения трех заданных чисел. 8*. Рассмотрите функцию Function y(ByVal ɯ, ByRef ɭ1) ɭ = ɯ ^ 3 - ɯ + 3 ɭ1 = ɯ^4 - 2*ɯ^2 + 3 End Function Каково значение: а) указателя у (2, у1) и переменной у1; б) указателя у (5, у1) и переменной у1; в) выражения у (4, у1) - у1?

Ɋɚɛɨɬɚɟɦ�ɫ�ɤɨɦɩɶɸɬɟɪɨɦ Внимание! Во время работы с компьютером соблюдайте правила безопасности и санитар-

но-гигиенические нормы. Задание 1. Составьте проект Фамилия_F_площадь1, в котором вычисляется площадь прямо-

угольного треугольника с применением функции. Задание 2. Составьте проект Фамилия_F_площадь2, в котором вычисляется площадь произ-

вольного треугольника по известным сторонам c использованием для функции формулы Герона.

Задание 3. Составьте и выполните проект Фамилия_F1 для вычисления значения функции z = х3+х2–4х+3 для х = 2 и х = 4.

Задание 4. Составьте и выполните проект Фамилия_F2 для вычисления значения функции f = f(a,b) = а5+ 3а3 – 5а + 3 + b2 + 2b, если а = 2 и b = 5.

Задание 5. Выполните проект Факториал (страница 60).

ɉɪɨɰɟɞɭɪɵ�ɩɨɥɶɡɨɜɚɬɟɥɹ Процедура – это подпрограмма, в которой решается вспомогательная задача.

;2211) +++++++++= yxyxyxzа

.1524212352715) +++++=zб

c)-b)(p-a)(p-p(p=S2

, cbapгде ++=

Page 66: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 65

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

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

Общее описание подпрограммы-процедуры таково: SUB <ɂɦɹBɩɪɨɰɟɞɭɪɵ> (<ɫɩɢɫɨɤ�ɮɨɪɦɚɥɶɧɵɯ�ɩɚɪɚɦɟɬɪɨɜ>) �ɫɟɪɢɹ�ɤɨɦɚɧɞ (ɬɟɥɨ�ɩɪɨɰɟɞɭɪɵ)> END SUB Имя придумывает пользователь. В списке формальных параметров через запятую перечис-

ляют переменные. Процедура сама не выполняется. Процедуру вызывают из главной программы с помощью

такой команды вызова: CALL < ɂɦɹBɩɪɨɰɟɞɭɪɵ> (<ɫɩɢɫɨɤ�ɮɚɤɬɢɱɟɫɤɢɯ�ɩɚɪɚɦɟɬɪɨɜ>) Служебное слово CALL (англ. вызвать) по умолчанию можно не писать. Параметры позволяют передать из главного кода в процедуру входные данные, а из проце-

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

ров и их типам. Действие команды. Во время выполнения команды CALL значение фактических парамет-

ров предоставляются соответствующим формальным параметрам. Выполняется серия команд. Результаты вычислений через параметры передаются в обратном направлении. Выполняется сле-дующая после CALL команда.

Синтаксис оператора Sub без параметров: Private Sub ИмяПодпрограммы() оператор 1 оператор 2 . . . . . . . . . . оператор N End Sub Слова Private, Sub и End Sub являются ключевыми. Ключевое слово Private означает, что к этой подпрограмме можно получить доступ только

лишь из кода формы Form1. ИмяПодпрограммы — это название подпрограммы. Можно использовать любое имя (луч-

ше, чтобы оно указывало на назначение подпрограммы). После имени подпрограммы ставят круглые скобки. В подпрограмму с синтаксисом без па-

раметров данные не передаются (выполняется только тело процедуры). Операторы кода подпрограммы содержатся между строками Sub и End Sub. Операторы вы-

полняются в порядке их записи. В подпрограмме можно использовать практически любые опера-торы.

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

Синтаксис подпрограммы с параметрами: Private Sub ИмяПодпрограммы (ByVal имяПараметра1 As типПараметра1, ByVal

имяПараметра2 As типПараметра2, ByVal имяПараметраN As типПараметраN) оператор 1 оператор 2 . . . . . . . . . . . оператор N End Sub

Строка заголовка подпрограммы

Ключевое слово Privat можно не указывать. По умолчанию система сама будет считать

процедуру без этого слова как Privat

Page 67: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 66

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

Ключевое слово ByVal определяет имя параметра, который будет получать значение из глав-ного кода. Типы параметров, стоящие после ключевого слова As, являются обычными типами переменных, такими как Integer, String и т. д.

В списке все параметры отделяются друг от друга запятыми. Формальные параметры, предназначенные для возвращения результатов в главный код, за-

писывают со словом ByRef перед ними (это называется передачей по адресу, по ссылке). Такая передача двусторонняя: данные можно пересылать из главного кода в подпрограмму и назад.

В VB по умолчанию действует режим передачи ByVal. Система автоматически допишет сло-во ByVal для всех параметров, если пользователь его не укажет. Поэтому пользователь должен указывать слово ByRef перед параметрами-результатами.

Правило. Формальному параметру-результату в списке фактических параметров может со-ответствовать только переменная.

Ɂɚɞɚɱɚ 1. ɉɪɨɟɤɬ�Ƚɢɩɨɬɟɧɭɡɚ

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

Решение. Процедуру назовем gipotenuza. Переменные ɚ и b будут содержать значения ка-тетов, а переменная ɫ - результат.

Код процедуры выглядит следующим образом: Sub gipotenuza(ByVal a As Single, ByVal b As Single, ByRef c As Single) c = Math.Sqrt(a ^ 2 + b ^ 2) End Sub Составим главный код с обращением к процедуре: Dim a1, b1, c1 As Single ɚ1 =3: b1 = 4 gipotenuza(ɚ1 , b1 , c1) MsgBox(c1) Рассмотрим схему

пересылки значений параметров между главной программой и процедурой. Вычис-ления и пересылки начинаются команда-ми а1 = 3 и b1 = 4 (да-лее по стрелкам) и за-канчиваются коман-дой вывода с1.

Список формальных параметров

Список фактических параметров

А С

В

с

b

a

Dim a1, b1, c1 As Single ɚ1 =3: b1 = 4

Call gipotenuza (a1, b1, c1) MsgBox(c1)

Sub gipotenuza (ByVal a As Single, ByVal b As Single, ByRef c As Single) c = Math.Sqrt(a ^ 2 + b ^ 2) End Sub

Page 68: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 67

Задание 1. Реализуйте код в проекте Фамилия_Гипотенуза2 и убедитесь, что для значений катетов 3 и 4 получим результат 5.

Задание 2. Модифицируйте код, чтобы дополнительно вычислить периметр и площадь пря-моугольного треугольника.

Есть два способа решения задачи: 1) использование предыдущей процедуры с увеличением количества параметров или 2) создание двух дополнительных процедур. Какой способ выберете вы?

ɉɪɨɰɟɞɭɪɧɵɣ�ɫɬɢɥɶ�ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ Если для решения задания 2 вы выбрали второй способ, то это значит, что вы не поняли

предназначение процедур и не умеете их применять. Создадим две следующие процедуры: Sub perymetr(ByVal a, ByVal b, ByVal c, ByRef p) p = a + b + c End Sub Sub ploshcha (ByVal a, ByVal b, ByRef s) s = a * b / 2 End Sub Составим главный код с обращением к трем процедурам:

‘ ɗɬɨ�ɝɥɚɜɧɵɣ�ɤɨɞ Dim ɚ, b, ɫ � ɚ = Inputȼɨɯ("ȼɜɟɞɢɬɟ�ɩɟɪɜɵɣ�ɤɚɬɟɬ") b = Inputȼɨɯ("ȼɜɟɞɢɬɟ�ɜɬɨɪɨɣ�ɤɚɬɟɬ") Call gipotenuza (a, b, ɫ) Call perymetr (ɚ, b, ɫ, ɪ) Call ploshcha (a, b, s) �ɜɵɜɟɫɬɢ�ɫ, ɪ�ɢ s>

ɉɪɨɰɟɞɭɪɵ�ɤɚɤ�ɫɪɟɞɫɬɜɨ�ɪɟɚɥɢɡɚɰɢɢ�ɩɪɢɧɰɢɩɚ�ɞɟɤɨɦɩɨɡɢɰɢɢ�ɚɥɝɨɪɢɬɦɨɜ Декомпозиция — разделение целого на части. Также декомпозиция — это научный метод,

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

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

Обработку данных в главном коде обычно не выполняют. Это делают в процедурах. При этом коды процедур отделены от главного кода.

Такой стиль программирования принято называть процедурным. ɉɟɪɟɞɚɱɚ�ɦɚɫɫɢɜɨɜ�ɜ�ɩɨɞɩɪɨɝɪɚɦɦɵ

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

Как передать массив процедуре (или функции) как параметр? В заголовке процедуры размерность массива не указывается, а в вызове процедуры указыва-

ется только имя массива.

Page 69: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 68

Например: Sub Sum (ByVal С( ) , ByRef S) Dim i As Integer S = 0 For i = 0 To 10 S = S + С(i) Next End Sub В главном коде: Dim A(10) As Integer Call Sum ( A , S)

ɋɬɚɧɞɚɪɬɧɵɟ�ɮɭɧɤɰɢɢ LBOUND() ɢ UBOUND() Что делать, если размерность массива вводится в программу по ходу ее выпол-нения и зара-

нее не известна? Есть 2 выхода из этой проблемы. 1. Объявить верхнюю границу массива как ГЛОБАЛЬНУЮ переменную. 2. Использовать стандартные функции, которые позволяют определить диапазон индексов

массива и тогда не требуется передавать размеры массивов через списки параметров, что позво-ляет обрабатывать массивы с разным количеством элементов (так называемые динамические массивы).

Стандартная функция LBOUND (A) определяет наименьшее значение индексов массива А. Стандартная функция UBOUND (A) определяет наибольшее значение индексов массива А. Например: Sub Sum (ByVal С( ), ByRef S) Dim i As Integer S = 0 For i = LBound(С) To UBound(С) S = S + С(i) Next End Sub

Ɂɚɞɚɱɚ 2. ɉɪɨɟɤɬ�Ɋɚɫɬɜɨɪɵ Задача 2. В растворах А и В содержится по 10 компонентов. Количество каждого компонен-

та в каждом растворе определяется по формуле: ai=1 + sini, где i = 1, 2, …, 10; bi=1 + cosi, где i = 1, 2, …, 10.

Растворы смешали и получили смесь С. Определить массы всех компонентов и массу смеси С. Оформим программу в виде главной программы и подпрограмм. В одной подпрограмме (с

именем Р1) выполним сложение значений элементов двух массивов, а в другой (Р2) вычислим суму элементов каждого массива.

Алгоритм решения. Количественные характеристики компонентов растворов занесем в мас-сивы А и В. Создадим массив С, который является суммой массивов А и В, определим его эле-менты по формуле ci=ai + bi , где i = 1, 2, …, 10, а затем вычислим сумму всех элементов масси-ва С.

Ʌɨɤɚɥɶɧɵɟ�ɢ�ɝɥɨɛɚɥɶɧɵɟ�ɩɟɪɟɦɟɧɧɵɟ Если в процедуре или функции надо использовать, кроме параметров, до-полнительные пе-

ременные, то эти переменные объявляют командой Dim в процедуре или функции. Такие пере-менные называют ЛОКАЛЬНЫМИ. После окончания работы подпрограммы локальные пере-менные теряют значение.

Массив как формальный параметр

Имя массива как фактический параметр

Page 70: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 69

Переменные, объявленные над подпрограммами (под строкой кода Public Class Form1), назы-вают ГЛОБАЛЬНЫМИ. Они сохраняют свои текущие зна-чения на входе и на выходе каждой подпрограммы.

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

Решим задачу с помощью подпрограмм. Поместим после строки кода Public Class Form1 объявление глобальной переменной N (ко-

личество строк) и две подпрограммы Dim N As Integer = 10 Sub P1(ByVal N, ByVal A(), ByVal B(), ByRef C()) Dim i As Integer For i = 1 To N C(i) = A(i) + B(i) Next End Sub Sub P2(ByVal N, ByVal C(), ByRef S) Dim i As Integer S = 0 For i = i To N S = S + C(i) Next End Sub А это главный код в обработчике щелчка кнопки: Dim i As Integer Dim S As Single Dim A(N), B(N), C(N) As Single For i = 1 To N A(i) = 1 + Math.Sin(i) B(i) = 1 + Math.Cos(i) Next Call P1(N, A, B, C) Call P2(N, C, S) MsgBox ("S =" & S) Результат выполнения программы будет такой:

S = 19,99374. Теперь подпрограммы Р1 и Р2 можно использо-

вать для решения других задач. Например, изменить значение количества компо-

нент N на 50. Задание 1. Создайте проект Фамилия_растворы,

в котором модифицируйте программу так, чтобы можно было вывести на экран массы каждого компонента для каждого из растворов.

При выводе элемента массива используйте его форматирование:

Format(A(i), "0.######")

Обратите внимание: в списке фактических па-раметров при обращении к процедуре указа-ны только имена массивов - без скобок.

Обратите внимание на использование скобок, если в списках формальных параметров есть массивы

Page 71: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 70

Ɂɚɞɚɱɚ 3. ɉɪɨɰɟɞɭɪɚ�ɩɨɥɭɱɟɧɢɹ�ɞɧɟɣ�ɦɟɫɹɰɚ

Задача 3. Построить процедуру, которая получает номер месяца невисокосного года и воз-вращает количество дней в нем.

Решение. Искомую процедуру назовем dniv: Sub dniv (ByVal nomer As Integer, ByRef dn As Integer) Select Case nomer Case 1, 3, 5, 7, 8, 10, 12 dn = 31 Case 2 dn = 28 Case 4, 6, 9, 11 dn = 30 End Select End Sub Задание 1. Выполните главный код, который обращается к процедуре dniv: Dim n, dni As Integer n = Val(InputBox("ȼɜɟɞɢɬɟ�ɧɨɦɟɪ�ɦɟɫɹɰɚ ")) Call dniv(n, dni) MsgBox (dni)

и убедитесь, что для марта (n = 3) ответ будет 31. Задание 2. Модифицируйте процедуру dniv так, чтобы она получала номер меся-ца и номер

года из диапазона лет от 2005 до 2020 и возвращала количество дней в заданном месяце и году. В этом диапазоне такие годы високосные: 2008, 2012, 2016, 2020.

Задание 3*. Модифицируйте процедуру так, чтобы она возвращала количество дней в задан-ном месяце любого года нашей эры.

Ключ-подсказка. Правило високосного года: год является високосным, если его числовое значение делится на 4 без остатка. Исключения составляют года 1900, 1800, 1700, 1500 ... (числовые значения которых делятся на 100, но не делятся на 400). Итак, числовое значение високосного года должно делиться без остатка на 4 и не делиться на 100 или делиться на 400. Это и есть критерий високосного года.

Page 72: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 71

Ⱦɨɩɨɥɧɢɬɟɥɶɧɵɟ�ɩɨɹɫɧɟɧɢɹ ɋɥɭɠɟɛɧɵɟ�ɨɩɢɫɚɬɟɥɶɧɵɟ�ɫɥɨɜɚ�ȼɭVal ɢ ByRef В общем случае в описании подпрограммы формальные параметры, которые предназначены

для получения данных из главного кода, записывают со словом ByVal перед параметром. Такую передачу параметров называют передачей по значениям. Она работает односторонне: передает данные из главного кода в подпрограмму.

Формальные параметры, предназначенные для возвращения результатов, записывают со сло-вом ByRef перед ними (это называют передачей по адресу, по ссылке). Такая передача является двусторонней: данные и можно пересылать из главного кода в подпрограмму и назад.

Что произойдет, если слова ByVal и ByRef не записать? В VB по умолчанию действует режим передачи ByVal. Система автоматически допишет сло-

во ByVal ко всем параметрам, если пользователь не укажет его. Это может привести к сущест-венной логической ошибке, поэтому пользователь должен будет собственноручно исправить слово ByVal на ByRef перед параметрами-результатами.

ɑɚɫɬɧɵɟ�ɢ�ɨɛɳɟɞɨɫɬɭɩɧɵɟ�ɩɨɞɩɪɨɝɪɚɦɦɵ Подпрограммы, которые помещены в коде, принадлежат форме и объекты других форм про-

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

Если к подпрограммам надо предоставить доступ из других форм проекта, модулей, или дру-гих проектов, то подпрограммы объявляют как общедоступные со служебным словом Public.

ɉɨɧɹɬɢɟ�ɨ�ɫɬɪɭɤɬɭɪɧɨɦ�ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɢ Вы уже знакомы с принципом декомпозиции больших задач и алгоритмов, в соответствии с

которым их нужно делить на простые части и последовательно детализировать (наполнять) час-ти, то есть создавать и реализовывать частичные решения, из которых будет состоять решение задачи. Этот принцип лежит в основе всех стилей программирования, в частности, структурного.

Структурный стиль программирования предполагает: 1. Использование трех базовых алгоритмических структур (линейной, ветвления, цикла) для создания решения или частичных решений. 2. Попытки избегать команды безусловного перехода GoTo. 3. Написание программ, понятных для лиц, которые будут их читать. 4. Система мер по проверке правильности кодов:

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

Рассмотрим эти принципы подробнее. Базовые структуры. Есть три базовые алгоритмические конструкции (структуры):

1) линейная (следования); 2) разветвления; 3) цикл. Доказано, что любой алгоритм можно реализовать с помощью базовых алгоритмических

структур и их комбинаций. Нужно избегать команд перехода. Считается, что команды перехода GoTo (особенно к преды-дущей части программы) затрудняют чтение программы. Поэтому их использование рекоменду-ют свести к минимуму. Избежать команд перехода можно с помощью таких конструкций языка, как команда If-Then-Else, команда выбора Select Case, подпрограммы с параметрами, команды цикла For и While.

Замечание. Чтобы заблаговременно выйти из некоторой конструкции, существуют команды «немедленного» выхода Exit:

Page 73: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 72

– Exit If, – Exit Select, – Exit While, – Exit For, – Exit Sub и т.д.

Понятность кодов. К некоторым кодам пользователь может возвращаться через определен-ное время, также эти коды могут читать другие лица. Поэтому коды должны быть понятны-ми не только автору. Для этого переменным и другим объектам дают названия, которые со-ответствуют содержанию задачи, а также пишут комментарии к кодам, в которых объясняют действия команд, а команды записывают с определенными отступами от левого поля. Такое написание команд называют структурированным. Правильность программы надо проверять до ее выполнения. Один из способов проверки программ - это поставить себя на место исполнителя-компьютера и пошагово с ручкой в руках выполнить код для таких входных данных (тестов), для которых это легко сделать или решение задачи известно. Такой прием называют трассировкой кода. Если полученный ре-зультат достоверен, то с большой вероятностью можно утверждать, что код правильный. Другой способ - применить средство среды разработки, которое называют отладчик (Debug). Он предназначен для пошаговой проверки кода с демонстрацией в окне кода или в окне Debug промежуточных значений переменных. Это позволяет определить правильность кода или выявить ошибки.

Ⱦɨɦɚɲɧɟɟ�ɡɚɞɚɧɢɟ Учить в пособии урок 6.5. Выполнить задания, приведенные ниже.

ɂɬɨɝɢ. ȼɨɩɪɨɫɵ�ɢ�ɡɚɞɚɧɢɹ ȼɵɩɨɥɧɢɬɟ�ɡɚɞɚɧɢɹ

1. Дана процедура Sub task1 (ByVal a, ByVal b, ByRef c, ByRef d) c = a + 2 * b d=c*2-3*a End Sub

Какие будут значения переменных : а) c и d после выполнения команды Call task1 (2, 3, c, d) б) k и n после выполнения команды Call task1 (3, 2, k, n)?

2. Дана подобная процедура, но параметр с описан со словом ByVal: Sub task2(ByVal a, ByVal b, ByVal c, ByRef d) c = a + 2 * b d=c*2 - 3*a End Sub

Какие будут значения переменных: а) с и d после выполнения команды Call task2 (2, 3, с, d) б) k и n после выполнения команды Call task2 (3, 2, k, n)?

3. Составьте процедуру, которая для заданной стороны куба вычисляет площадь его боковой по-верхности и объем. 4. Составьте процедуру, которая вычисляет стоимость нескольких единиц некоторого товара. 5. Составьте процедуру, которая для трех чисел вычисляет сумму, произведение и среднее ариф-метическое. 6. Составьте процедуру, которая для заданного числа возвращает сообщение: «число положи-тельное», «число отрицательное», «число 0». 7. Составьте процедуру, которая определяет минимальное значение из трех переданных ей чисел.

Page 74: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 73

Ⱦɚɣɬɟ�ɨɬɜɟɬɵ�ɧɚ�ɜɨɩɪɨɫɵ 1. Для чего нужны процедуры пользователя? 2. Какая разница между стандартной событийной процедурой и процедурами пользователя? 3. Каков синтаксис процедуры пользователя? 4. Каков синтаксис вызова процедуры пользователя? 5. Для чего используют формальные и фактические параметры? 6. Что означают служебные слова слова ByVal и ByRef? В чем отличие их действия?

ɋɚɦɨɟ�ɜɚɠɧɨɟ�ɜ�ɷɬɨɦ�ɩɭɧɤɬɟ Процедура – это подпрограмма, в которой решается вспомогательная задача. В отличие от функции, подпрограмма-процедура позволяет вычислить и передать в главную программу не одно, а несколько значений. Общее описание подпрограммы-процедуры: SUB <Имя_процедуры> (<список формальных параметров>) <серия команд (тело процедуры)> END SUB

В списке формальных параметров через запятую перечисляют переменные. Процедуру вызывают и главной программы с помощью команды вызова: CALL < Имя_процедуры> (<список фактических параметров>) Списки формальных и фактических параметров должны совпадать по количеству парамет-

ров и их типам. Синтаксис оператора Sub без параметров: Private Sub ИмяПодпрограммы() оператор 1 оператор 2 . . . . . . . . . . оператор N End Sub Синтаксис подпрограммы с параметрами: Private Sub ИмяПодпрограммы (ByVal имяПараметра1 As типПараметра1, ByVal

имяПараметра2 As типПараметра2, ByRef имяПараметраN As типПараметраN) оператор 1 оператор 2 . . . . . . . . . . . оператор N End Sub Ключевое слово ByVal определяет имя параметра, который будет получать значение из

главного кода. Его можно не писать, оно будет добавлено к имени параметра автоматически. Формальные параметры, предназначенные для возвращения результатов в главный код, за-

писывают со словом ByRef перед ними. Пользователь должен всегда указывать слово ByRef пе-ред параметрами-результатами.

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

Массив можно передать процедуре (или функции) как параметр. При этом в заголовке проце-дуры размерность массива не указывается, а в вызове процедуры указывается только имя масси-ва.

Если размерность массива вводится в программу по ходу ее выполнения и заранее не извест-на, то для использования ее в подпрограмме есть 2 возможности:

1. Объявить верхнюю границу массива как ГЛОБАЛЬНУЮ переменную.

Page 75: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 74

2. Использовать стандартные функции, которые позволяют определить диапазон индексов массива. Стандартная функция LBOUND(A) определяет наименьшее значение индексов массива А. Стандартная функция UBOUND(A) определяет наибольшее значение индек-сов массива А.

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

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

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

Если к подпрограммам надо предоставить доступ из других форм проекта, модулей, или дру-гих проектов, то подпрограммы объявляют как общедоступные со служебным словом Public.

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

Структурный стиль программирования предполагает: 1. Использование трех базовых алгоритмических структур (линейной, ветвления, цикла)

для создания решения или частичных решений. 2. Избегать команды безусловного перехода GoTo. 3. Написание программ, понятных для лиц, которые будут их читать. 4. Система мер по проверке правильности кодов.

Ɋɚɛɨɬɚɟɦ�ɫ�ɤɨɦɩɶɸɬɟɪɨɦ Внимание! Во время работы с компьютером соблюдайте правила безопасности и санитар-но-гигиенические нормы.

ɉɪɨɟɤɬ Sub_Sort Заполнить одномерный массив А(1…10) случайными значениями от 0 до 20 и вывести его в

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

Решение. Создайте новую Windows-программу с именем Фамилия_Sub_Sort. 1. Поместите на форму грид и кнопку «Выполнить сортировку». В свойстве грида Columns (Collections) создайте коллекцию столбцов, которые подпишите

«1», «2», ..., «10» и задайте свойству AutoSizeColumnxMode значение Fill. Форма примет вид, как на рисунке:

Создадим программный код для вывода таблицы в грид и выполне-ния сортировки с помощью подпро-грамм.

Объявим глобальные перемен-ные после строки кода Public Class Form1:

Dim a(10) As Integer Dim i, j As Integer Двойным щелчком по форме создадим событийную процедуру ее загрузки и в ней запишем

код заполнения массива случайными числами и вывод его в первую (с индексом 0) строку грида.

Page 76: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 75

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

нимального элемента массива. Поскольку массив А(10) объявлен как глобальная переменная, то он доступен и в подпро-

грамме MinElement. Чего не скажешь о переменной n, которую требуется возвращать в главный код и описывать с ключевым словом ByRef

Создадим программный код для кнопки «Выполнить сортировку».

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

Page 77: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 76

Ɋɚɡɝɚɞɚɣɬɟ�ɪɟɛɭɫɵ

Page 78: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 77

ȼɵɩɨɥɧɢɬɟ�ɩɪɨɟɤɬɵ ȼɵɩɨɥɧɢɬɟ�ɩɪɨɟɤɬ�ɫ�ɩɪɢɦɟɧɟɧɢɟɦ�ɧɟɫɬɚɧɞɚɪɬɧɵɯ�ɮɭɧɤɰɢɣ

ɉɪɨɟɤɬ�ɎɚɦɢɥɢɹBɆɟɪɵ Создайте программу, которая будет преобразовывать единицы измерения. Создайте проект с именем Фамилия_Меры. Форма должна иметь такой вид, как на рисунке. По щелчку кнопки Преобразовать в украинском единицы измерения преобразуются значения

правого столбца. По щелчку кнопки Преобразовать в американские единицы измерения преобразуются значе-

ния левого столбца.

Используйте такие коэффициенты перевода:

– 1 километр = 0,621 мили; – 1 литр = 0,264 галлона; – 1 доллар США = 25.8397933 украинские гривны; – 1 украинская гривна = 0.038625 доллара США.

Курс валют на текущее время уточните в Интернете. Функция перевода из американских миль в украинские километры может быть записана так: Private Function MilesToKilometers(ByVal miles As Single) Return (miles / 0.621) ' ɜɨɡɜɪɚɳɚɟɦ�ɪɟɡɭɥɶɬɚɬ�ɩɟɪɟɜɨɞɚ�ɦɢɥɶ�ɜ�ɤɢɥɨɦɟɬɪɵ End Function

Вызов этой процедуры с форматированием данных до четырех знаков после запятой в обра-ботчике события щелчка кнопки Button1_Click может быть записан так: TextBox4.Text = Format(MilesToKilometers(Val(TextBox1.Text)), "0.####")

Две другие функции (для перевода галлонов и долларов) пишутся по аналогии. Функция перевода из американских миль в украинские километры может быть записана так: Private Function KilometersToMiles(ByVal km As Single) Return (km * 0.621) ɜɨɡɜɪɚɳɚɟɦ�ɪɟɡɭɥɶɬɚɬ�ɩɟɪɟɜɨɞɚ�ɤɢɥɨɦɟɬɪɨɜ�ɜ�ɦɢɥɢ End Function

Две другие функции (для перевода литров и гривен) пишутся по аналогии. ȼɵɩɨɥɧɢɬɟ�ɩɪɨɟɤɬ�ɫ�ɩɪɢɦɟɧɟɧɢɟɦ�ɩɪɨɰɟɞɭɪ�ɩɨɥɶɡɨɜɚɬɟɥɹ

Создайте новую Windows-программу с именем Фамилия_Sub. Создайте пустую форму. В контекстном меню формы (правая кнопка мыши) выберите View Code. Откроется окно ко-да, связанного с событиями формы. Под строкой Public Class Form1 введите код: Private Sub MyMessage() MsgBox (“ɗɬɨ�ɫɨɨɛɳɟɧɢɟ�ɨɬ�ɩɨɞɩɪɨɝɪɚɦɦɵ MyMessage.")

Page 79: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 78

End Sub Как видно из кода, во время выполнения кода подпрограммы MyMessage в окне сообщения будет выведен текст: «Это сообщение от подпрограммы MyMessage». Как использовать такой код? Чтобы обеспечить выполнение кода подпрограммы, вам нужно написать оператор, который

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

Синтаксис вызова подпрограммы-процедуры следующий: [ Call ] ИмяПодпрограммы ()

То, что ключевое слово Call (англ. вызов) стоит в квадратных скобках означает, что его мож-но не писать. Попробуем вызывать процедуру MyMessage. Добавьте на форму командную кнопку. Измените значение атрибута Text кнопки Button1 на MyMessage. Дважды щелкните кнопку Button1, чтобы изменить код обработ-чика события щелчка кнопки. Добавьте к нему такую строку кода: MyMessage() Получим такой код программы:

Постройте и запустите проект. Щелкните кнопку MyMessage. Откроется окно сообщения с текстом: «Это сообщение от подпрограммы MyMessage». Откуда оно взялось? Оно было выведено кодом, который содержится в подпрограмме

MyMessage. Выбрав кнопку, вы вызывали подпрограмму, и таким образом был выполнен этот код. Теперь добавьте еще одну подпрограмму в проект Sub. Она будет выводить на экран другое сообщение. Теперь добавьте еще одну подпрограмму в проект Sub. Она будет выводить на экран другое сообщение. Откройте окно кода формы и введите такой код после оператора End Sub подпрограммы

MyMessage: Private Sub YourMessage() MsgBox ("ɗɬɨ�ɫɨɨɛɳɟɧɢɟ�ɩɨɞɩɪɨɝɪɚɦɦɵ YourMessage") End Sub Вызовите подпрограмму YourMessage из подпрограммы MyMessage (но не из обработчика

события щелчка кнопки!). Измените подпрограмму MyMessage, чтобы она приобрела вид: Private Sub MyMessage() MsgBox (“ɗɬɨ�ɫɨɨɛɳɟɧɢɟ�ɨɬ�ɩɨɞɩɪɨɝɪɚɦɦɵ MyMessage") YourMessage() End Sub

Page 80: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 79

Мы добавили вызов подпрограммы YourMessage в подпрограмму MyMessage. Постройте и запустите проект. Щелкните кнопку MyMessage. Последовательно откроется два окна сообщения. В первом будет содер-жаться текст: «Это

сообщение от подпрограммы MyMessage», а во втором: «Это сообщение подпрограммы YourMessage».

Как срабатывает такой код? Обработчик события щелчка кнопки вызы-вает подпрограмму MyMessage. Когда она вызывается, выполняется код, который содержится в этой подпрограмме.

В подпрограмме MyMessage находятся две строки кода: первая выводит на экран сообщение «Вот сообщения от подпрограммы MyMessage», а вторая вызывает подпрограмму YourMessage, которая, в свою очередь, обеспечивает вывод на экран сообщения «Вот сообщение подпрограм-мы YourMessage».

Удобно! Вы создали две собственных подпрограммы и вызывали первую из обработчика со-бытия щелчка кнопки, а вторую — из первой!

Откройте окно кода проекта. Под строкой End Sub подпрограммы YourMessage добавьте но-вый фрагмент кода:

Private Sub GeneralMessage(ByVal InMessage As String) MsgBox (InMessage) End Sub Этой подпрограмме нужно передать аргумент типа String. Когда она будет вызвана, на экран

выведется окно сообщения со значением параметра (текстовая строка). Давайте вызовем подпрограмму GeneralMessage, передав ей аргумент типа String. Добавьте вторую кнопку в форму Form1 проекта SimpleSub. Измените значение атрибута Text кнопки Button2 на AnyMessage. Дважды щелкните кнопку

Button2, чтобы изменить код обработчика события щелчка кнопки. Добавьте строки кода: GeneralMessage ("Ʌɸɛɨɟ�ɫɨɨɛɳɟɧɢɟ.") GeneralMessage ("Ⱦɪɭɝɨɟ�ɫɨɨɛɳɟɧɢɟ.") GeneralMessage ("ȿɳɟ�ɨɞɧɨ�ɫɨɨɛɳɟɧɢɟ.") Постройте и запустите проект. Щелкните кнопку AnyMessage. Будет выведено три разных сообщения. Как такое возможно? В коде обработчика события щелчка кнопки подпрограмма GeneralMessage вызывается три-

жды. Каждый раз в подпрограмму в качестве аргумента передается новая строка текста. Первый раз подпрограмма вызывается с аргументом "Любое сообщение", второй раз – с ар-

гументом "Другое сообщение", а третий – с аргументом "Еще одно сообщение". Когда вызывается подпрограмма, ей передается аргумент, который впоследствии использует-

ся оператором MsgBox. Напишите подпрограмму, которая получает в качестве аргументов два целых числа, склады-

вает их, а затем в окне сообщения выводит сумму. Добавьте новую подпрограмму Adder (Сумматор), в проект Фамилия_Sub. Подпрограмма

Adder будет иметь вид: Private Sub Adder(ByVal Add1 As Integer, ByVal Add2 As Integer) Dim Sum As Integer Sum = Add1 + Add2 MsgBox(Sum) End Sub

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

Page 81: h c i j h ] j Z f f h cteacherjournal.in.ua/blog/articles/2399/5a9ea51c3fc.pdf · 2018-04-09 · Жук Елена 3 9 класс Q : K L V I. H ^ g h f _ j g u _ f Z k k b \ u 6.1.1

Жук Елена 9 класс 80

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

Добавьте такую строку кода: Adder (34, 57) Постройте и запустите проект. Щелкните кнопку Сложить. На экран монитора выведется сообщение с результатом 91. Обработчик события щелчка кнопки вызывает подпрограмму Adder, он передает ей два це-

лочисленных значения — 34 и 57. В подпрограмме Adder выполняются три строки кода. В первом объявляется переменная

Sum, которой потом присваивается значение суммы параметров Add1 (34) и Add2 (57). Перемен-ные Add1 и Add2 содержат значения, которые передаются подпрограмме при ее вызове. Наконец, подпрограмма выводит на экран значение переменной Sum (91).

Теперь вы можете создавать собственные подпрограммы, вызывать их и передавать им дан-ные.