- •7. Одномерные массивы 114
- •8. Обработка двумерных массивов (матриц) 162
- •9. Обработка строк 183
- •10. Тип данных, определенный пользователем. Структуры 214
- •11. Использование подпрограмм 228
- •Приложение 52 310 Список литературы 313 Введение
- •1. Этапы создания Windows-приложения
- •2. Среда Visual Basic 2005
- •2.1. Структура среды Visual Basic 2005
- •2.2. Создание нового проекта
- •2.3. Сохранение проекта
- •2.4. Выполнение приложения
- •2.5. Основные команды среды Visual Basic 2005
- •2.6. Методы тестирования
- •2.7. Отладка приложений в среде vb
- •3. Разработка интерфейса в среде vb. Основные элементы управления
- •3.1. Метка
- •3.2. Текстовое поле
- •3.3. Кнопка
- •3.4. Окно списка
- •3.5. Выравнивание положения элементов управления
- •4. Программа линейной структуры
- •4.1. Понятие переменной
- •4.2. Типы данных
- •4.3. Объявление переменных
- •4.4. Оператор присваивания
- •Оператор присваивания работает справа налево.
- •4.5. Константы
- •4.6. Арифметические операции
- •4.7. Математические функции
- •4.8. Арифметическое выражение
- •4.9. Окно ввода (InputBox)
- •4.10. Окно вывода сообщения (MsgBox)
- •4.11. Пример. Вычисление площади треугольника
- •4.12. Пример. Нахождение цифр числа
- •5. Организация ветвлений
- •5.1. Логические константы и переменные
- •5.2. Операции сравнения
- •5.3. Логические операции
- •5.4. Логическое выражение
- •5.5. Условный оператор
- •5.6. Функция iIf
- •5.7. Оператор множественного ветвления ElseIf
- •5.8. Оператор выбора Select Case
- •5.9. Оператор безусловного перехода GoTo
- •5.10. Пример. Решение линейного уравнения
- •5.11. Пример. Программа-калькулятор
- •6. Программирование повторений
- •6.1. Цикл со счетчиком
- •6.1.1. Табуляция функции
- •6.1.2. Вычисление факториала
- •6.1.3. Обработка совокупности чисел с известным числом элементов
- •6.2. Цикл с условием
- •6.2.1. Ввод с проверкой
- •6.2.2. Обработка совокупности чисел с неизвестным числом элементов
- •6.2.3. Вычисление суммы ряда по общей формуле
- •Вычисление суммы ряда с использованием рекуррентного соотношения
- •6.2.5. Вычисление произведения ряда
- •Решение нелинейных уравнений методом простой итерации
- •7. Одномерные массивы
- •Массивы всегда обрабатываются в цикле.
- •7.1. Ввод массива
- •Вывод массива в окно списка и в текстовое поле
- •7.3. Вычисление суммы и произведения элементов массива
- •7.4. Определение количества элементов массива, удовлетворяющих некоторому условию
- •7.5. Вычисление среднего арифметического и среднего геометрического элементов массива, удовлетворяющих некоторому условию
- •7.6. Нахождение максимального элемента массива
- •7.7. Нахождение минимального элемента массива, удовлетворяющего некоторому условию
- •7.8. Поиск первого элемента массива, удовлетворяющего некоторому условию
- •7.9. Поиск последнего элемента массива, удовлетворяющего некоторому условию
- •7.10. Замена одного элемента массива
- •7.11. Замена всех элементов массива, удовлетворяющих некоторому условию
- •7.12. Перестановка местами двух элементов массива
- •7.13. Формирование нового массива из некоторых элементов исходного массива
- •7.14. Проверка совпадения всех элементов массива
- •7.15. Проверка упорядоченности всех элементов массива
- •7.16. Сортировка массива методом пузырька
- •7.17. Линейная сортировка массива (методом поиска минимума)
- •Никогда нельзя использовать одновременно оба способа перестановки элементов массива.
- •8. Обработка двумерных массивов (матриц)
- •8.1. Ввод прямоугольной матрицы
- •8.2. Вывод прямоугольной матрицы в окно списка и в текстовое поле
- •8.3. Поиск максимального элемента матрицы
- •8.4. Обработка матрицы по строкам
- •8.5. Обработка матрицы по столбцам
- •8.6. Обработка квадратных матриц
- •Для обработки элементов, стоящих на любой диагонали, достаточно одного цикла. Для обработки элементов, принадлежащих к одному из треугольников, необходимо использовать вложенные циклы.
- •9. Обработка строк
- •9.1. Основные функции обработки строк
- •9.2. Посимвольная обработка строки
- •9.3. Формирование массива слов строки
- •9.4. Формирование строки из массива слов
- •9.5. Слова-палиндромы
- •9.6. Выделение чисел из строки
- •9.7. Сравнение строк
- •9.8. Обработка многострочного текста
- •10. Тип данных, определенный пользователем. Структуры
- •10.1. Описание структуры. Область видимости. Понятие метода
- •10.2. Оператор With
- •10.3. Ввод массива структур
- •10.4. Вывод массива структур
- •10.5. Поиск в массиве структур
- •10.6. Формирование нового массива из некоторых элементов исходного массива
- •10.7. Сортировка массива структур
- •11. Использование подпрограмм
- •11.1. Определение процедуры и функции. Описание процедуры и функции
- •11.2. Передача параметров по ссылке и по значению
- •11.3. Формальные параметры и фактические переменные
- •11.4. Локальные и глобальные переменные
- •11.5. Static-переменные
- •Приложение 1
- •Приложение 2
- •Приложение 3
- •Приложение 4
- •Приложение 5
- •Приложение 6
- •Приложение 7
- •Приложение 8
- •Приложение 9
- •Приложение 10
- •Приложение 11
- •Приложение 12
- •Приложение 13
- •Приложение 14
- •Приложение 15
- •Приложение 16
- •Приложение 17
- •Приложение 18
- •Приложение 19
- •Приложение 20
- •Приложение 21
- •Приложение 22
- •Приложение 23
- •Приложение 24
- •Приложение 25
- •Приложение 26
- •Приложение 27
- •Приложение 28
- •Приложение 29
- •Приложение 30
- •Приложение 31
- •Приложение 32
- •Приложение 33
- •Приложение 34
- •Приложение 35
- •Приложение 36
- •Приложение 37
- •Приложение 38
- •Приложение 39
- •Приложение 40
- •Приложение 41
- •Приложение 42
- •Приложение 43
- •Приложение 44
- •Приложение 45
- •Приложение 46
- •Приложение 47
- •Приложение 48
- •Приложение 49
- •Приложение 50
- •Приложение 51
- •Приложение 52
- •Список литературы
11.2. Передача параметров по ссылке и по значению
В Visual Basic 2005 существует два режима передачи параметров в подпрограмму: передача по значению и передача по ссылке.
Когда параметр передается по значению, перед его именем ставится ключевое слово ByVal. В этом случае в подпрограмму передается копия параметра. Любые изменения значения данного параметра, выполненные в теле подпрограммы, теряются при возвращении в вызывающую программу. Другими словами, изменение копии параметра не отображается на оригинале. Как правило, по значению передаются входные параметры.
Параметр, передаваемый по ссылке, обозначается ключевым словом ByRef. В этом случае в подпрограмму передается ссылка на область памяти, в которой хранится оригинальное значение данного параметра (иногда грубо говорят, что в подпрограмму передается оригинал параметра). При этом любое изменение значение параметра в теле подпрограммы сразу записывается в память компьютера на место старого значения параметра. Таким образом, после завершения работы подпрограммы в памяти хранится измененное значение параметра. Другими словами, передача параметра по ссылке позволяет сохранить в памяти компьютера измененное значение параметра. Выходные параметры могут передаваться только по ссылке.
Рассмотрим пример использования различных режимов передачи параметров. Сначала проанализируем используемые подпрограммы.
Процедура printпредназначена для вывода значения целочисленной переменной в окно списка. У нее два входных параметра:stroka– это поясняющий текст, который будет выводиться перед значением переменной,znach– значение, которое надо вывести. Это значение может быть только целым числом. Так как обе переменных в процессе вывода не меняют своих значений, то они передаются по значению. Перед их именами ставим ключевое словоByVal. Обратите внимание, что по правилам языка Visual Basic 2005 режим передачи указывается отдельно для каждого параметра.
Private Sub print(ByVal stroka As String, _
ByVal znach As Integer)
В окно списка lstAвыводим поясняющий текст и значение, которое предварительно преобразуем с помощью функцииStr.
lstA.Items.Add(stroka + Str(znach))
End Sub
Следующая процедура иллюстрирует передачу параметра по значению. Ее единственный параметр – целочисленная переменная a. Перед ней стоит ключевое словоByVal, которое показывает, что параметр передается по значению.
Private Sub Test1(ByVal a As Integer)
К переменной aдобавляем число 5 и записываем результат на место старого значения этой же переменной.
a += 5
Выводим значение переменной aв окно списка, указывая в поясняющем тексте имена процедуры и переменной.
print("Sub Test1 a=", a)
End Sub
Третья процедура иллюстрирует передачу параметра по ссылке. Ее единственный параметр – целочисленная переменная a. Перед ней стоит ключевое словоByRef, которое показывает, что параметр передается по ссылке.
Private Sub Test2(ByRef a As Integer)
К переменной aдобавляем число 5 и записываем результат на место старого значения этой же переменной.
a += 5
Выводим значение переменной aв окно списка, указывая в поясняющем тексте имена процедуры и переменной.
print("Sub Test2 a=", a)
End Sub
Теперь рассмотрим текст вызывающей (или главной) программы.
Объявляем целочисленную переменную a.
Dim a As Integer
Присваиваем ей начальное значение.
a = 2
Очищаем окно списка от результатов предыдущих запусков программы.
lstA.Items.Clear()
Выводим поясняющий текст. Сначала рассмотрим передачу параметра по значению.
lstA.Items.Add("ByVal")
Выводим в окно списка значение переменной a, хранящееся в главной программе.
print("Main prog. a=", a)
Вызываем процедуру Test1, в которую параметрaпередается по значению.
Test1(a)
Печатаем значение переменной aпосле выполнения процедуры.
print("Main prog. a=", a)
Еще раз вызываем процедуру Test1.
Test1(a)
И снова печатаем значение переменной a, полученное после выполнения процедуры.
print("Main prog. a=", a)
Третий раз вызываем процедуру Test1.
Test1(a)
И третий раз печатаем значение переменной a.
print("Main prog. a=", a)
Выводим горизонтальную черту, чтобы зрительно отделить результаты одной подпрограммы от результатов другой.
lstA.Items.Add("----------------------------------")
Опять задаем начальное значение переменной a.
a = 2
Выводим поясняющий текст. Теперь мы рассматриваем передачу параметра по ссылке.
lstA.Items.Add("ByRef")
Выводим в окно списка значение переменной a, хранящееся в главной программе.
print("Main prog. a=", a)
Вызываем процедуру Test2, в которую параметрaпередается по ссылке.
Test2(a)
Печатаем значение переменной aпосле выполнения процедуры.
print("Main prog. a=", a)
Еще раз вызываем процедуру Test2.
Test2(a)
И снова печатаем значение переменной a, полученное после выполнения процедуры.
print("Main prog. a=", a)
Третий раз вызываем процедуру Test2.
Test2(a)
И третий раз печатаем значение переменной a.
print("Main prog. a=", a)
Пример работы этой программы приведен на рис. 70. Проанализируем полученные результаты. В первом блоке параметр передавался по значению. При этом изменения значения параметра, происходящие в теле подпрограммы, не влияют на значение соответствующей переменной в вызывающей программе. Это прекрасно видно на рис. 70. Сначала в главной программе переменная aимеет значение 2. Внутри процедурыTest1к ней прибавляется число 5, и значение параметра становится равным 7. Но при возвращении в вызывающую программу этот результат теряется, и значение переменнойaпо-прежнему равно 2. Этот процесс повторяется трижды.
Рис. 70.Передача параметров по значению и по ссылке
Иначе происходит передача параметра по ссылке. Это иллюстрирует второй блок результатов (рис. 70). Сначала в главной программе переменная aимеет значение 2. Внутри процедурыTest2к ней прибавляется число 5, и значение параметра становится равным 7. Так как параметрaпередается в процедуруTest2по ссылке, то любые изменения его значения, происходящие в подпрограмме, сохраняются при возвращении в вызывающую программу. Что мы и видим в четвертой строке второго блока. Измененное значение переменнойaеще два раза передается в подпрограммуTest2, где к ней добавляется число 5. Так как параметрaпередается по ссылке, то измененный результат всякий раз будет сохраняться в главной программе.