Определение размера массива в период выполнения программы.

Когда массив определяется оператором Dim, то явным образом указывается его размер. Но; не всегда можно заранее предсказать точный размер массива. В отдельных случаях его размер можно взять с запасом. Но при таком подходе обязательно появляются две проблемы. Во-первых, слишком большой массив — пустая трата памяти. А во-вторых, нет гарантии в том, что обьем массива будет достаточен.

В Visual Basic эту проблему решает оператор ReDim, позволяющий переопределять массивы. Оператор ReDim не объявление, а команда, выполняемая только при работе программы. Чтобы им воспользоваться, уберите из объявления массива определение размерности maxSize. Это заставит Visual Basic создать динамический массив (dynamic array); его размер — в отличие от статического — может изменяться. Синтаксис оператора ReDimимеет следующий вид:

ReDim [Preserve] nepeменная (maxSize )

Его синтаксис похож на синтаксис оператора Dim с той разницей, что здесь допускается указывать ключевое слово Preserve, а вместо maxSize можно подставить любое целочисленное выражение. Если в операторе ReDimнет ключевого слова Preserve, предыдущее содержимое массива уничтожается при его переопределении (т.е. массив фактически создается заново). При наличии ключевого слова Preserve, новый массив сохраняет содержимое предыдущего. Однако, если новый размер меньше, чем старый, "лишние" элементы, естественно, отбрасываются.

 

 

Массивы объектов

Кроме обычных массивов, хранящих данные различного типа, в Visual Basic разрешается определять массивы объектов (Control arrays) (элементов управления), что весьма удобно, если в программе имеются группы объектов, действующих примерно одинаково. Такие массивы позволяют "привязывать" разные элементы управления к одной процедуре обработки события. Например, если в программе создан массив из трех командных кнопок, щелчок любого из этих объектов вызывает одну и ту же процедуру обработки события Click. Visual Basic дает возможность различать конкретные объекты в массиве — это достигается передачей в процедуру индекса нужного элемента.

Циклы

Цикл Do….Loop позволяет многократно выполнять какую-либо группу операторов. Синтаксис его простейшей формы:

Цикл с предусловием
Do { While | Until } условие выхода [операторы]... Loop
Цикл с постусловием
Do [операторы]... Loop { While | Until } условие выхода

 

Ключевое слово Do помечает начало составного оператора, в который входят все операторы вплоть до ключевого слова Loop. Операторы последовательно выполняются программой, пока не встретится ключевое слово Loop; после чего происходит возврат к первому оператору за ключевым словом Do. Закончив цикл, программа продолжается с оператора, стоящего за ключевым словом Loop. После ключевого слова While или Until должно присутствовать условие выхода в форме логического выражения. Группу повторяемых таким образом операторов называют циклом (loop). А когда программа обрабатывает эти операторы, говорят, что она выполняет цикл. Бесконечныйцикл — это цикл у которого никогда не выполняется условие выхода.

В Visual Basic организовать выход из цикла можно по-разному. Если используется ключевое слово While(до тех пор, пока…), которое указывается за оператором Do, и условие выходав форме логического выражения имеет значение True, то операторы, расположенные в теле цикла, выполняются. Если выражение принимает значение False, операторы, расположенные в теле цикла, пропускаются.

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

В ряде случаев имеет смысл заменить ключевое слово While другим — Until. Последнее инвертирует логику проверки условия.

 

Циклы со счетчиком

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

For переменная = начальное_значение То конечное_значение [Step приращение]

[операторы}.

Next [переменная}

Оператор For организует цикл, в котором переменная-счетчик инициализируется начальным значением; с каждым циклом оно возрастает на величину заданного приращения до тех пор, пока переменная-счетчик не достигнет конечного значения. Если раздел Step опускается, приращение составляет 1. Начальное значение должно быть меньше конечного — если только приращение не является отрицательным. В последнем случае начальное значение, естественно, должно быть больше конечного.

Цикл For можно записать как цикл Do While, однако первый проще, поэтому применяется гораздо чаще. Отметим, что выражение Тов цикле For эквивалентно сравнению "меньше или равно" в цикле Do While (при положительном приращении) либо "больше или равно" (при отрицательном). Поэтому для выхода из цикла величина переменной-счетчика не обязательно должна совпадать с конечным значением, указанным в цикле.

Порядок выполнения работы

2.1 Откройте новый проект:

· запуститe среду программирования Visual Basic,появится окно среды с диалоговым окном нового проекта (New Project), в котором указан установленный по умолчанию тип проекта Standard.exe.

· в диалоговом окне New Project нажать кнопку Open. После запуска среды программирования появляется форма, которая по умолчанию называется Form1,

· выведите на экране окна Properties Window и Project Explorer, если они невидимы. Обратите внимание на то, что в окне Project Explorer в папке Formsимеется одна форма Form1 с именем (Form1).

2.3 Добавьте в проект новую форму – форму 2:

· выберите в строке менюсистемы программированияпунктProject,

· выполнитекомандуAdd Form. В появившемся окне Add Form на закладке New предлагается по умолчанию Form,

· в окне Add Form нажмите кнопку Open. Появляется окно проекта с новой формой, которая по умолчанию называется Form2.Обратите внимание на то, что в окне Project Explorer в папке Forms появилась новая форма Form2 с именем по умолчанию (Form2).

2.4 Задайте свойства Form1 и Form2согласно таблице 2.1. Переход от одной форме к другой осуществляется двойным щелчком на пиктограмме формы в окне Project Explorer.

Таблица 2.1

Объект Свойство Значение
Form1 Name frmSa
  Caption Исходные данные
  Height
  Width
  Top
  BoderStyle 1- Fixed Single
  BackColor Светло-желтый
Form2 Name frmTabl
  Caption Параметры стандартной атмосферы
  Height
  Width
  Left
  Top
  BoderStyle 1- Fixed Single

2.5 Задайте пути для сохранения проекта в своей личной папке:

· перейдите в окно Project Explorerи убедитесь в том, что активна форма с именем frmSa,

· откройте меню File,

· в открывшемся диалоговом окне Save File As:

ü убедитесь, что открыта ваша личная папка на диске Z:,

ü укажите имя файла satm4-1, нажмите на кнопку “Save“,

· перейдите в окно Project Explorer и сделайте активной форму с именем frmTabl,

· откройте меню File,

· в открывшемся диалоговом окне Save File As:

ü убедитесь, что открыта ваша личная папка на диске Z:,

ü укажите имя файла satm4-2, нажмите на кнопку “Save“,

· откройте меню File,

· выполните команду Save Project As,

· в открывшемся диалоговом окне Save Project As:

ü убедитесь, что открыта ваша личная папка на диске Z:,

ü введите имя файла satm4 (по умолчанию оно будет Project1) и нажмите на кнопку “Save“

 

2.6 Расположите ЭУ на форме 1 (frmSa )

· перейдите в окно Project Explorerи сделайте активной форму с именем frmSa,

· расположите на форме командные кнопки Command1, Command2, Command3, Command4 и текстовые поля Text1, Text2, Text3,

· задайте им свойства согласно таблице 2.2 и 2.3:

Таблица 2.2

Объект Свойство Значение
Группа командных кнопок Font** Arial, (полужирный) Bold,12
  MousePoiter NoDrop
Command1 Name CmdCnl
  Caption &Cancel
  Cancel True
  TabIndex
Command2 Name CmdHlp
  Caption &Help
  TabIndex
Command3 Name CmdOk
  Caption &OK
  TabIndex
  Default True
Command4 Name CmdTbl
  Caption &Table
  Enabled False

 

Таблица 2.3

Объект Свойство Значение
Группа текстовых полей Font** Arial, (полужирный) Bold,12
  ForeColor синий
  MaxLenght
Text1 Name** TxtHn
  Text (пустая строка)
  TabIndex
Text2 Name TxtHpr
  TabIndex
  Text (пустая строка)
Text3 Name TxtHk
  TabIndex
  Text (пустая строка)

 

 

· расположите на форме метки Label1, Label2, Label3 и задайте им свойства согласно таблице 2.4:

 

 

Таблица 2.4

Объект Свойство Значение
Группа меток AutoSize True
Label1 Caption Начальная высота (м)
Label2 Caption Приращение высоты (м)
Label3 Caption Конечная высота (м)

 

2.7 Расположите ЭУ на форме 2 (frmTabl)

· перейдите в окноProject Explorerи сделайте активной форму с именем frmTabl,

· расположите на форме 2 командную кнопку Command1 и задайте ей свойства согласно таблице 2.5:

Таблица 2.5

Объект Свойство Значение
Command1 Name CmdExt
  Caption &Exit

· расположите на форме 2 текстовое поле Text1(с размерами на всю форму) и задайте ему свойства согласно таблице 2.6:

Таблица 2.6

Объект Свойство Значение
Text1 Name** TxtTbSa
  Font** Arial, (полужирный) Bold,12
  ForeColor синий
  ScrollBars 2-Vertical
  MultiLine True
  Text (пустая строка)

 

2.8 Создайте код для обработки события нажатие кнопки Cancel (как в работе №2)

2.9 Создайте код для обработки события нажатие кнопки Table.

· перейдите в окно Project Explorer и сделайте активной форму с именем frmSa,

· введите в тело процедуры Private Sub cmdTbl_Click() текст

rmTabl.Show

frmSa.CmdTbl.Enabled = False

2.10 Создайте код для обработки события нажатие кнопки Ok.

· перейдите в окно Project Explorer и сделайте активной форму с именем frmSa,

· введите в тело процедуры Private Sub cmdOk_Click() текст

cmdTbl. Enabled = True

2.11 Создайте код для обработки события нажатие кнопки Exit.

· перейдите в окно Project Explorer и сделайте активной форму с именем frmTabl,

· введите в тело процедуры Private Sub cmdExt_Click() текст

frmSa.Show

Me.Hide

2.12 Сохраните проект в своей личной папке.

· перейдите в окноProject Explorer и убедитесь в том что активна форма с именем frmSa,

· откройте меню File и выполните команду Save satm4-1.frm,

· перейдите в окно Project Explorer и сделайте активной форму с именем frmTabl,

· откройте меню File и выполните команду Save satm4-2.frm,

· откройте меню Fileивыполните команду Save Project .

2.13 Протестируйте программу

· запустите программу на выполнение в среде VB5.0,

· установите курсор на кнопку Ok и нажмите клавишу Enter. Кнопка Table становится доступной,

· установите курсор на кнопку Table и нажмите левую клавишу мыши. На экран выводится форма 2,

· установите курсор на кнопку Table и нажмите клавишу Enter. Форма 1 становится активной.

· нажмите клавишу Esc. Обратите внимание на то, что происходит выход из программы с удалением обеих форм с экрана.

2.14 Создайте код обработки события при нажатии кнопки Help, который обеспечивает вывод информационной панели

· с текстом заголовка "Ввод исходных данных",

· с пунктами сообщения:

"1. Допустимый диапазон высот от 0 до 15000 м”

“2. Значение начальной высоты должно быть меньше значения конечной высоты"

"3. Приращение высоты должно быть меньше значения конечной высоты

“4. Для запуска - нажать клавишу Enter "

2.15 Протестируйте программу и убедитесь в правильности вывода информационной панели.

2.16 Объедините результаты расчета в двумерный массив gsngSa(1, 100), состоящий из 5 строк и ста колонок, и объявите его глобальным.

Переменная Имя массива
Расчетные значения высот gsngSa(1, 100)
Значение давлений для высот gsngSa(2, 100)
Значение плотности для высот gsngSa(3, 100)
Значение температуры для высот gsngSa(4, 100)
Значение скорости звука для высот gsngSa(5, 100)

 

· вызовите окно кода,

· выберите в списке объектов элемент (General), в списке процедур появится один элемент Declarations,

· установите режим проверки объявления всех переменных, введя в поле кода следующий текст

Option Explicit,

· установите нумерацию индексов массива с единицы, введя в поле кода следующий текст

Option Base 1

· объявите массив gsngSa(5, 100), введя в поле кода текст

Dim gsngSa(5, 100) As Single

2.17 Объявите в процедуре cmdOK_Click() константы как локальные.

Константа Значение константы Имя костанты
Давление у земли sngP0
Коэффициент перевода давления из мм.рт.ст. в н/м2 133.322 sngCfnP
Плотность у земли 1.225 sngR0
Коэффициент перевода плотности из кгс*c24 в кг/м3 9.0665 sngCfnR
Температура у земли 288.15 sngT0
Температура на высоте 11000 метров 216.7 sngTh11000

· выберите в поле кода процедуру cmdOK_Click(),

· введите перед строкой cmdTbl. Enabled = True следующий текст

Rem Описание констант

Const sngP0 As Single = 101325 ‘Значение давления у земли

· аналогичным образом объявите остальные константы.

2.18 Объявите другие переменные как локальные

· введите в процедуру cmdOK_Click() после блока описания констант следующий текст

Rem Описание локальных переменных

Dim sngGradTempH As Single

Dim gsngH_n As Single ‘ Начальное значение высоты

Dim gsngH_pr As Single ’ Приращение значения высоты

Dim gsngH_k As Single ’Конечное значение высоты

Dim sngStpn As Single

Dim j As Integer

Dim k As Integer

Dim m As Integer

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

· введите в процедуру cmdOK_Click() после блока описания локальных переменных следующий текст

Rem Присвоение и ввод переменных

sngGradTempH = 0.0065

· организуйте ввод переменных - введите

gsngH_n = Val(txtHn.Text)

gsngH_k = Val(txtHk.Text)

gsngH_pr = Val(txtHpr.Text)

· присвойте значения переменным - введите

j = 1

2.20 Сформируйте в процедуре cmdOK_Click() управляющую структуру

· введите пред строкой cmdTbl.Enabled = True следующий текст

If gsngH_n < 0 Or gsngH_n > 15000 Or gsngH_k < 0 Or gsngH_k > 15000 Then

Rem Вывод сообщения об ошибке ввода высоты

MsgBox "1. Значение высоты или приращения высоты выходят за допустимые пределы " + vbCrLf _

+ "2. Введите значение высоты от 0 до 15000 метров "

Else If gsngH_k <= gsngH_n Then

MsgBox "1. Значение конечной высоты меньше начальной высоты"

TxtHn.Text = "" 'Вывод пустой строки в поле ввода

TxtHk.Text = ""

TxtHpr.Text = ""

Else

gsngSa(1, j) = gsngH_n ‘ Начальное значение высоты присваивается элементу массива с индексом 1.

Rem Расчет параметров атмосферы

End If

 

2.21 Протестируйте программу

· запустите программу на выполнение в среде VB5.0,

· введите в поле ввода начальной высоты значение 1000,

· введите в поле ввода приращение высоты значение 1000,

· введите в поле ввода конечной высоты значение 1000,

· нажмите клавишу Enter. Должна выводиться информационная панель с сообщением об ошибке ввода,

· закройте информационную панель,

· введите в поле ввода другие ошибочные значения высот,

· нажмите клавишу Enter,

· закройте информационную панель,

· завершите выполнение программы, нажав значок[X] в заголовке формы.

 

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

· после строки “Rem Расчет параметров атмосферы” введите следующие строки

Do While gsngSa(1, j) <= gsngH_k

If gsngSa(1, j) <= 11000 Then

'Формулы расчета для тропосферы

End If

If gsngSa(1, j) > 11000 Then

'Формулы расчета для стратосферы

End If

Rem Расчет параметров цикла

gsngSa(1, j + 1) = gsngSa(1, j) + gsngH_pr ‘ Определение высоты для нового шага цикла

j = j + 1’ Увеличение счетчика количества циклов

Loop

2.23 Закодируйте формулы расчета параметров атмосферы в тропосфере

· введите в процедуру после строки комментария “Формулы расчета для тропосферы” выражение для расчета давления

gsngSa(2, j) = sngP0 * (1 - gsngSa(1, j) / 44300) ^ 5.256

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

2.24 Закодируйте формулы расчета параметров стандартной атмосферы в стратосфере

· после строки комментария “Формулы расчета для стратосферы” введите выражение для расчета пременной sngStpn

sngStpn = -(gsngSa(1, j) - 11000) / 6340

· для расчета давления в стратосфере введите

gsngSa(2, j) = 169.4 * Exp(sngStpn) * sngCfnP

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

 

2.25 Подготовьте текстовые поля ввода для ввода новых значений

· в процедуре cmdOK_Click() перед строкой CmdTbl.Enabled = True - введите

TxtHn.Text = "" 'Вывод пустой строки в поле ввода

TxtHk.Text = ""

TxtHpr.Text = ""

Rem Формирование строк вывода результатов расчета

2.26 Сформируйте строку вывода результатов расчета переменной gstrP_sa

· в разделе общих описаний обьявите глобальную строковую переменную

Public gstrP_sa As String

· в процедуре cmdOK_Click() после строки “Rem Формирование строк вывода результатов расчета” сформируйте строку вывода значения высоты – введя

For m = 1 To i

For k = 1 To 5

gstrP_sa = gstrP_sa + Format(gsngSa(k, m), "Scientific") + Space$(2)

Next k

gstrP_sa = gstrP_sa + vbCrLf

Next m

gstrP_sa = "Высота " + " Давление" + " Плотность" + "Температура" _
+ "Скорость звука" + vbCrLf + gstrP_sa

2.27 Организуйте вывод строки результатов в форме 2

· в процедуре Private Sub Form_Activate() после строки введите текст

frmTabl.TxtTbSa.Text = frmSa.gstrP_sa

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

· запустите программу на выполнение в среде VB5.0,

· введите в поле ввода начальной высоты значение 0,

· введите в поле ввода приращенния высоты значение 1000,

· введите в поле ввода конечной высоты значение 15000,

· нажмите клавишу Enter. Кнопка Table становится доступной,

· нажмите кнопку Table. На экран выводится форма 2. Сравните результаты с табличными значениями

Высота Давление Плотность Температура Скорость звука
1,225 340,28
0,364 216,6 294,3
0,194 216,6 294,3

· завершите выполнение программы, нажав значок [X] в заголовке формы.

2.29 Протестируйте программу.

· запустите программу на выполнение в среде VB5.0,

· введите в поле ввода начальной высоты значение 0,

· введите в поле ввода приращенния высоты значение 10,

· введите в поле ввода конечной высоты значение 15000,

· нажмите клавишу Enter. Программа не работает. Обьясните причину.

2.30 Устраните ошибку для чего

· в необходимых местах кода программы вставьте следующие операторы

Dim gsngSa() As Single

Dim i As Integer

i = (gsngH_k - gsngH_n) \ gsngH_pr + 1

ReDim gsngSa(5, i + 1)

· повторите пунк 2.29 и убедитесь в нормальной работе программы.

2.30 Сохраните разработанный проект.

2.31 Закройте среду программирования


Лабораторная работа № 5

Процедуры и функции

Задание: Модифицировать код приложения Satm4, оформив как отдельные процедуры:

· формулы расчета параметров стандартной атмосферы в тропосфере и стратосфере,

· вывод сообщений, когда значения высот вводятся с ошибкой,

· запрет ввода текстовых символов в поля ввода,

· запрет нажатия клавиши OK, если хотя бы в одном из полей ввода отсутствуют цифровые символы.

В ходе работы необходимо

изучить:

· команды меню для создания процедур;

научиться:

· добавлять новые формы к проекту,

· создавать код процедур.

 

Теоретическая часть