«Программирование в среде Visual Basic»

Вид материалаЛабораторная работа
Общие положения
With объект
Private - доступна для других процедур только того модуля, в котором она описана; имя
Sub, тип которых не указан явно с помощью слов Public
Sub, когда требуется использовать возвращаемое функцией значение, процедура Function
Видимость процедур
Debug.Print a(i, j); 'Вывод двумерного массива в окно Отладки
Dim n As Integer, m As Integer
Public Sub vivod_Form()
Подобный материал:
1   2   3   4   5   6   7   8

Общие положения


В VB есть возможность задать свойства объектов программно с помощью оператора With … End With, который выполняет последовательность операторов над одиночным объектом

With объект

[блок операторов]

End With

где объект -имя объекта;

блок операторов - один или несколько операторов, выполняемых над объектом или

.элемент управления.свойство=значение.

Процедура типа Sub.

[Private | Public] Sub имя ([список аргументов])

операторы

End Sub

Обращение к процедуре Sub

Call имя(список аргументов)

или

имя список аргументов

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

Private - доступна для других процедур только того модуля, в котором она описана;

имя- имя процедуры;

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

операторы - блок операторов, выполняемых в процедуре.

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

Процедуры Function.

[Public | Private] Function имя([список аргументов]) [As тип]

операторы

имя = выражение

End Function

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

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

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

выражение -возвращаемое значение процедуры Function.

Однако в отличие от процедуры Sub, когда требуется использовать возвращаемое функцией значение, процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, Sqr, Cos или Chr.

Видимость процедур

Переменные и константы характеризуются областью видимости – областью, где они «видны», т.е. доступны для программы. За пределами своей области видимости переменная не может быть использована программой. Область видимости опеределяется двумя обстоятельствами: где она объявлена и какое дополнительное слово стоит при ней:

- в области объявлений, выше начало процедур, то переменная доступна всем процедурам модуля;

- если при этом вместо ключевого слова Dim стоит Public – то переменная доступна для всех модулей и процедур в них.

Пример:

Задан двумерный числовой массив а(n,m), где а - переменная, определяющая имя и элементы массива, n - количество строк массива, m - количество столбцов (квадратная матрица n=m). Решить следующие задачи:
  1. В каждой строке массива поменять местами диагональный элемент на первый.
  2. Сформировать одномерный массив b, состоящий из положительных элементов массива a.
  3. Подсчитать сумму положительных элементов в каждом столбце, результаты вывести в виде одномерного массива s.
  4. Найти максимальный элемент массива, его номера строки и столбца.
  5. Заменить все отрицательные элементы максимальным.

Sub Form1_Load() Запуск программы при запуске формы

Dim s() As Integer, b()

Dim a() As Single

n = InputBox("к-во строки:", "Размерность")

m = InputBox("к-во столбцов:", "Размерность")

ReDim a(1 To n, 1 To m)

ReDim s(m), b(n * m)

For i = 1 To n '__________________Ввод элементов двумерного массива

For j = 1 To m

a(i, j) = Int(100 * Rnd - 60) 'генератором

st$ = st$ & Format(a(i, j), "##") & " " ‘формирование строки элементов массива

Debug.Print a(i, j); 'Вывод двумерного массива в окно Отладки

Next j

st$ = st$ & Chr(13)

Debug.Print

Next i

MsgBox "Массив" & Chr(13) & " " & st$

'Задача 1______________________________________________________________

For i = 1 To n

pr = a(i, 1)

a(i, 1) = a(i, i)

a(i, i) = pr

Next i

Debug.Print "замена диагонального на первый"

For i = 1 To n '_____________________вывод двумерного массива в окно Отладки

For j = 1 To m

Debug.Print a(i, j);

Next j

Debug.Print

Next i

'Задача 2_______________________________________________________________

k = 0

For i = 1 To n

For j = 1 To m

If a(i, j) > 0 Then k = k + 1: b(k) = a(i, j)

Next j

Next i

Debug.Print "массив положительных"

For i = 1 To k '___________________вывод одномерного массива

Debug.Print b(i);

Next i

Debug.Print

'Задача 3___________________________________________________________

For j = 1 To m

For i = 1 To n

If a(i,j)>0 Then s(j) = s(j) + a(i, j)

Next i, j

Debug.Print "Суммы в столбцах"

For j = 1 To m '_____________________Вывод одномерного массива

Debug.Print s(j);

Next j

'Задача 4________________________________________________________________

max = a(1, 1)

For i = 1 To n

For j = 1 To m

If a(i, j) >= max Then max = a(i, j): iMax = i: jMax = j

Next j, i

MsgBox "Максимум " & max & Chr(13) & "№стр. " & iMax & Chr(13) & "№столб. " & jMax

Debug.Print "максимальный" & max, iMax, jMax

'Задача 5________________________________________________________________

For i = 1 To n

For j = 1 To m

If a(i, j) <0 Then a(i,j)=max

Next j, i

For i = 1 To n ‘_________________Вывод двумерного массива

For j = 1 To m

st$ = st$ & Format(a(i, j), "##") & " "

Debug.Print a(i, j);

Next j

st$ = st$ & Chr(13)

Debug.Print

Next i

MsgBox "Массив " & Chr(13) & " " & st$

End Sub

Пример формы:

Задан двумерный массив а(n,m), где а - переменная, определяющая имя и элементы массива, n - количество строк массива, m - количество столбцов (для одномерного задаеться только один параметр). Решить следующие задачи:
  1. Найти 1-ый положительный элемент массива и его номера строки и столбца.
  2. Заменить все четные элементы на 1-ый положительный.
  3. Определить среднее арифметическое отрицательных элементов.



Некоторые свойства элементов управления заданы программно с помощью оператора With…End With . Программа заупускается при запуске формы:

Option Base 1

'Объявление глобальных переменных, размерность массива и сам массив

Dim n As Integer, m As Integer

Dim a() As Single .

Private Sub Form_Load()

With Form1

.Caption = "Лаб.работа №5"

.CmdВвод.Caption = "Ввод"

.CmdСброс.Caption = "Сброс"

.CmdВыход.Caption = "Выход"

.CmdВыход.ToolTipText = "Конец работы"

.Chk1.Caption = "на форму"

.Chk1.Value = 2

.Chk2.Caption = "в окно Immediate"

.Chk2.Value = 2

.Chk3.Caption = "в окно сообщения"

.Chk3.Value = 2

.Opt1.Caption = "в ручную"

.Opt2.Caption = "генератором"

.LblУсловие.Caption = ""

.TxtВвод.Locked = True

.CmdЗадача1.Caption = "Найти 1-ое положительное в массиве"

.CmdЗадача2.Caption = "Определить среднеарифметическое отрицательных элементов"

.CmdЗадача3.Caption = "Поменять четные элементы на 1-ый положительный"

.LblЗадача2.AutoSize = True

.LblЗадача2.Caption = ""

.LblЗадача2.WordWrap = False

.LblЗадача3.AutoSize = True

.LblЗадача3.Caption = ""

.LblЗадача3.WordWrap = False

.TxtЗадача1.Locked = True

End With

End Sub

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

'Ввод и вывод элементов массива

Private Sub CmdВвод_Click()

n = InputBox("Введите количество строк:")

m = InputBox("Введите количество столбцов:")

ReDim a(n, m)

LblУсловие.Caption = "Задан двумерный массив " & "a(" & n & "," & m & ")"

Call vvod Обращение к процедуре ввода массива

'вывод массива на форму

If Chk1.Value = 1 Then Call vivod_Form Обращение к процедуре вывода на форму

'вывод массива в окно Отладки

If Chk2.Value = 1 Then Call vivod_Immediate …………. в окно Отладки

'Вывод массива в окно сообщения

If Chk3.Value = 1 Then Call vivod_Msg ………….. в окно сообщения

End Sub


Процедура ввода массива

Public Sub vvod()

If Opt1.Value = True Then

'ввод массива в окне сообщения

For i = 1 To n

For j = 1 To m

a(i, j) = InputBox("введите элемент:" & i & "," & j, "Ввод элементов")

Next j, i

ElseIf Opt2.Value = True Then

'ввод массива генератором

For i = 1 To n

For j = 1 To m

a(i, j) = Int(100 * Rnd - 60)

Next j, i

End If

End Sub

Процедуры вывода

Public Sub vivod_Form()

'вывод массива на форму

For i = 1 To n

For j = 1 To m

TxtВвод.Text = TxtВвод.Text & a(i, j) & " "

Next j

TxtВвод.Text = TxtВвод.Text & Chr(13) + Chr(10)

Next i

End Sub

Public Sub vivod_Immediate()

'вывод массива в окно Отладки

For i = 1 To n

For j = 1 To m

Debug.Print a(i, j);

Next j

Debug.Print

Next i

End Sub


Public Sub vivod_Msg()

'Вывод массива в окно сообщения

For i = 1 To n

For j = 1 To m

st$ = st$ & Format(a(i, j), "##") & " "

Next j

st$ = st$ & Chr(13)

Next i

MsgBox "Массив" & Chr(13) & " " & st$

End Sub

Кнопки решения Задач 1-3

Private Sub CmdЗадача1_Click()

'Нахождения 1-го положительного в массиве

LblЗадача3.Caption = Pol(i1, j1) Функция нахождения 1-го положительного

End Sub


Private Sub CmdЗадача2_Click()

'Нахождение ср.арифметического

'Вывод на форму значения функции Sr

LblЗадача2.Caption = Format(Sr(), "##.###")

End Sub


'замена четных на 1-ый положительный

Private Sub CmdЗадача3_Click()

For i = 1 To m

For j = 1 To n

If a(i, j) Mod 2 = 0 Then a(i, j) = Pol(i1, j1)

TxtЗадача1.Text = TxtЗадача1.Text & a(i, j) & " "

Next j

TxtЗадача1.Text = TxtЗадача1.Text & Chr(13) + Chr(10)

Next i

End Sub


Функции

'Функция нахождения1-го положительного

Function Pol(i1, j1)

Dim flag As Integer

For j = 1 To m

flag = 0

For i = 1 To n

If a(i, j) > 0 Then

flag = 1

Pol = a(i, j): i1 = i: j1 = j

Exit For

End If

Next i

If flag = 1 Then Exit For

Next j

End Function

'Функция нахождения Sr ср.арифметического

Public Function Sr()

Dim ko As Integer

Dim s As Single

For i = 1 To n

For j = 1 To m

If a(i, j) < 0 Then s = s + a(i, j): ko = ko + 1

Next j

Next i

Sr = s / ko

End Function


Кнопки Сброс и Выход аналогичны кнопкам в предыдущих лабораторных.