- •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.4. Локальные и глобальные переменные
Переменная, описанная в теле подпрограммы, называется локальной. Ее значение доступно только в той подпрограмме, в которой описана данная переменная. После завершения подпрограммы значение локальной переменной теряется, если эта переменная не была объявлена с помощью оператора Static(см. раздел 11.5).
Глобальная переменная описывается вне всех подпрограмм, в том числе и вне главной (вызывающей) программы. Как правило, глобальные переменные описываются в самом начале модуля, сразу после заголовка модуля или класса. Для описания глобальных переменных используются операторы PrivateиPublic(см. раздел 4.3). В отличие от локальной переменной значение глобальной переменной доступно во всех подпрограммах модуля и всегда сохраняется между вызовами подпрограмм. Но широкое использование глобальных переменных в сложных программах не рекомендуется, так как большое количество глобальных переменных существенно усложняет процесс отладки программы.
Если в пределах одной программы одновременно встречаются глобальная и локальная переменная с одинаковыми именами, то в пределах той подпрограммы, где описана локальная переменная, она всегда будет перекрывать одноименную глобальную переменную.
Рассмотрим пример программы, использующей глобальную переменную. Текст этой программы начинается с объявления глобальной целочисленной переменной n.
Private n As Integer
Затем описываются все необходимые подпрограммы.
Процедура 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
Следующая процедура изменяет значение глобальной переменной n. Она на единицу увеличивает значение параметраb, переданного по ссылке, и на единицу уменьшает значение глобальной переменнойn.
Private Sub Test3(ByRef b As Integer)
b += 1
n -= 1
End Sub
Теперь проанализируем главную (вызывающую) программу. В ней мы опишем локальную целочисленную переменную b.
Dim b As Integer
Определим начальное значение для этой переменной.
b = 6
Теперь зададим значение глобальной переменной n.
n = 8
Очищаем окно списка от результатов предыдущих запусков программы.
lstA.Items.Clear()
Выводим поясняющий текст.
lstA.Items.Add("Global")
Используя процедуру print, печатаем начальные значения локальной и глобальной переменных.
print("local b=", b)
print("global n=", n)
Выводим горизонтальную черту, чтобы зрительно отделить исходные данные от полученных результатов.
lstA.Items.Add("----------------------------------")
Вызываем процедуру Test3, чтобы изменить значение локальной переменнойb.
Test3(b)
Полученный результат выводим в окно списка с помощью процедуры print. Для контроля правильности работы программы распечатаем значение глобальной переменнойn.
print("local b=", b)
print("global n=", n)
Еще раз выведем горизонтальную черту, чтобы зрительно отделить первый блок результатов от второго.
lstA.Items.Add("----------------------------------")
Повторно вызовем процедуру Test3, чтобы с ее помощью изменить значение глобальной переменнойn.
Test3(n)
Для контроля правильности работы программы выведем значение локальной переменной bи измененное значение глобальной переменнойn.
print("local b=", b)
print("global n=", n)
Пример работы программы приведен на рис. 72. Проанализируем полученные результаты.
Рис. 72.Глобальные и локальные переменные
В первом блоке выведены начальные значения переменных bиn.
Второй блок выводится после первого вызова процедуры Test3, которая должна на единицу увеличить значение переменнойb. Действительно, значение переменнойbизменилось на единицу и стало равным 7, но при этом изменилось и значение глобальной переменнойn. Оно уменьшилось на единицу и тоже стало равно 7.
Третий блок результатов выводится после второго вызова процедуры Test3. В этом случае мы хотим с помощью процедуры изменить значение глобальной переменнойn, уменьшив его на единицу. Очевидно, что значение локальной переменнойbпри этом не должно изменить. Рассмотрим полученные результаты. Действительно, значение переменнойbосталось прежним. Но и значение глобальной переменнойnне изменилось, хотя мы его передавали в подпрограммуTest3по ссылке и, следовательно, должны были получить результат.
Так проявляется один из побочных эффектов использования глобальных переменных. Что же происходит на самом деле? При переходе в процедуру Test3глобальная переменнаяnподставляется на место формального параметраb. Так как этот параметр передается по ссылке, то все его изменения будут сохранены в памяти компьютера. Таким образом, операторb += 1изменяет значение глобальной переменнойn, которая, являясь фактической переменной при вызове подпрограммы, подставляется вместо формального параметраb. После этого оператора значение переменнойnстановится равным 8. Но следующая строка процедурыTest3изменяет значение глобальной переменнойn, уменьшая его на единицу:n -= 1. В результате значение переменнойnснова становится равным 7. Очевидно, что с точки зрения главной (вызывающей) программы никакого изменения глобальной переменнойnв процедуреTest3не происходит.