Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
информатика.doc
Скачиваний:
45
Добавлен:
22.03.2016
Размер:
12.91 Mб
Скачать

2.4 Оператор цикла с параметром With

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

Возьмем следующее описание:

type

TDate = record

Day : Integer:

Month : Integer;

Year : Integer: end;

var OrderDate: TDate;

С учетом данного описания приведем пример оператора with:

with OrderDate do

if Month = 12 then

begin

Month := 1;

Year := Year + 1 end else

Month := Month + 1;

Это эквивалентно следующему:

if OrderDate.Month = 12 then

begin

OrderDate.Month := 1;

OrderDate.Year := TDate.Year + 1 end

Else

Date.month := TDate.Month + 1;

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

Допустим описаны следующие переменные:

type

TPoint = record

x,y: Integer;

end;

var

x: Point;

y: Integer;

В этом случае и к x, и к y можно обращаться, как к переменной или как к полю записи. В операторе:

with x do

begin

x := 10;

y := 25;

end;

x между ключевыми словами with и dо относится к переменной типа

указатель, а в составном операторе x и y ссылаются на x.x и y.y.

Оператор:

with V1,V2,...Vn do s;

эквивалентен операторам:

with V1 do

with V2 do

...

with Vn do

S;

В обоих случаях, если Vn является полем и v1, и v2, то она интерпретируется как v2.Vn, а не как v1.Vn.

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

Лабораторный практикум № 2. Табулирование функции

Выполнение лабораторной работы “Табулирование функции” состоит из двух частей:

– табулирование функции в Excel;

– табулирование функции в VBA.

Критерием правильности является совпадение полученных таблиц, рис. 1..

Целью лабораторной работы “Операторы цикла” является освоение грамматических конструкций VBA, обеспечивающих эффективную организацию циклических процессов.

Лабораторная работа “Операторы цикла” выполняется в среде VBA.

При этом одна и та же разветвляющаяся функция g(x) табулируется на листе Excel семь раз с использованием семи различных конструкций операторов цикла:

Do While … loop ;

Do Loop … while ;

Do Until … loop ;

Do Loop … until ;

While … wend ;

For … next ;

For Each … next .

Рис. 1.

– В программах используется специально созданная пользовательская функция g(x);

Процесс создания функции пользователя следующий:

– находясь в Excel, включить редактор VBA, нажав ALT-F11;

– включить режим вставки – insert;

– выбрать – Module;

– в появившемся окне написать текст модуля, соответствующий программируемой функции –

Function g(x)

If x <= 0 Then g = Sin(x) Else g = Exp(-x)

End Function

– нажать пиктограмму – Run Sub/UserForm;

– в появившемся окне Macros щелкнуть по клавише Cancel, что обеспечивает внесение функции g(x) в библиотеку модулей мастера функций fx; с этого момента функция g(x) доступна всем пользователям мастера функций fx в разделах “Полный алфавитный перечень” либо “Определенные пользователем”;

ИМЕНА ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ НЕ ДОЛЖНЫ СОВПАДАТЬ С АДРЕСАМИ ЯЧЕЕК ТАБЛИЦЫ EXCEL.

– В программах используется функция Format(x, "0.0#"), которая обеспечивает вывод указанной переменной, в данном случае X, в заданном формате "0.0#", в данном случае, один разряд до десятичной точки, два – после;

– В модуле с оператором For Eachnext используется динамическое объявление массивов

Dim x() As Double

Dim y() As Double

с последующим уточнением мерности массивов

ReDim x((xk - xn) / xd)

ReDim y((xk - xn) / xd), которое может размещаться в любом месте программы;

– Так как оператор цикла For Eachnext может оперировать только с элементами одного множества, то для вывода спектров значений аргумента X и функции g(x) используются два разных оператора

For Each n In x

Next n

и

For Each n In y

Next n.

Программы табулирования разветвляющейся функции в Excel с использованием операторов цикла

Private Sub CommandButton1_Click()

Dim i As Integer

Dim j As Integer

Dim x As Double

Dim w As String

w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")

If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 1), Cells(28, 3)) = Clear

xn = InputBox("xn =", "Введите начало диапазона", -3)

xk = InputBox("xk =", "Введите конец диапазона", 7)

xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)

i = InputBox("i =", "Введите начало таблицы, строку", 7)

j = InputBox("j =", "Введите начало таблицы, столбец", 1)

Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"

i = i + 1

x = xn

Do While x <= xk

Cells(i, j) = Format(x, "0.0#")

If x <= 0 Then

Cells(i, j + 1) = Format(g(x), "#0.0###")

Else

Cells(i, j + 2) = Format(g(x), "#0.0###")

End If

x = x + xd: i = i + 1

Loop

End Sub

Private Sub CommandButton2_Click()

Dim i As Integer

Dim j As Integer

Dim x As Double

w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")

If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 4), Cells(28, 6)) = Clear

xn = InputBox("xn =", "Введите начало диапазона", -3)

xk = InputBox("xk =", "Введите конец диапазона", 7)

xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)

i = InputBox("i =", "Введите начало таблицы, строку", 7)

j = InputBox("j =", "Введите начало таблицы, столбец", 4)

Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"

i = i + 1

x = xn

Do

Cells(i, j) = Format(x, "0.0#")

If x <= 0 Then

Cells(i, j + 1) = Format(g(x), "#0.0###")

Else

Cells(i, j + 2) = Format(g(x), "#0.0###")

End If

x = x + xd: i = i + 1

Loop While x <= xk

End Sub

Private Sub CommandButton3_Click()

Dim i As Integer

Dim j As Integer

Dim x As Double

Dim w As String

w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")

If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 7), Cells(28, 9)) = Clear

w = InputBox("w =", "очистить диапазон? - Y/N")

If w = "Y" Then Range(Columns(1), Rows(15)) = Clear

xn = InputBox("xn =", "Введите начало диапазона", -3)

xk = InputBox("xk =", "Введите конец диапазона", 7)

xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)

i = InputBox("i =", "Введите начало таблицы, строку", 7)

j = InputBox("j =", "Введите начало таблицы, столбец", 7)

Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"

i = i + 1

x = xn

Do Until x > xk

Cells(i, j) = Format(x, "0.0#")

If x <= 0 Then

Cells(i, j + 1) = Format(g(x), "#0.0###")

Else

Cells(i, j + 2) = Format(g(x), "#0.0###")

End If

x = x + xd: i = i + 1

Loop

End Sub

Private Sub CommandButton4_Click()

Dim i As Integer

Dim j As Integer

Dim x As Double

Dim w As String

w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")

If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 10), Cells(28, 12)) = Clear

xn = InputBox("xn =", "Введите начало диапазона", -3)

xk = InputBox("xk =", "Введите конец диапазона", 7)

xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)

i = InputBox("i =", "Введите начало таблицы, строку", 7)

j = InputBox("j =", "Введите начало таблицы, столбец", 10)

Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"

i = i + 1

x = xn

Do

Cells(i, j) = Format(x, "0.0#")

If x <= 0 Then

Cells(i, j + 1) = Format(g(x), "#0.0###")

Else

Cells(i, j + 2) = Format(g(x), "#0.0###")

End If

x = x + xd: i = i + 1

Loop Until x > xk

End Sub

Private Sub CommandButton5_Click()

Dim i As Integer

Dim j As Integer

Dim x As Double

Dim w As String

w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")

If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 13), Cells(28, 15)) = Clear

xn = InputBox("xn =", "Введите начало диапазона", -3)

xk = InputBox("xk =", "Введите конец диапазона", 7)

xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)

i = InputBox("i =", "Введите начало таблицы, строку", 7)

j = InputBox("j =", "Введите начало таблицы, столбец", 13)

Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"

i = i + 1

x = xn

While x <= xk

Cells(i, j) = Format(x, "0.0#")

If x <= 0 Then

Cells(i, j + 1) = Format(g(x), "#0.0###")

Else

Cells(i, j + 2) = Format(g(x), "#0.0###")

End If

x = x + xd: i = i + 1

Wend

End Sub

Private Sub CommandButton6_Click()

Dim i As Integer

Dim j As Integer

Dim x As Double

Dim w As String

w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")

If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 16), Cells(28, 18)) = Clear

xn = InputBox("xn =", "Введите начало диапазона", -3)

xk = InputBox("xk =", "Введите конец диапазона", 7)

xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)

i = InputBox("i =", "Введите начало таблицы, строку", 7)

j = InputBox("j =", "Введите начало таблицы, столбец", 16)

Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"

i = i + 1

For x = xn To xk Step xd

Cells(i, j) = Format(x, "0.0#")

If x <= 0 Then

Cells(i, j + 1) = Format(g(x), "#0.0###")

Else

Cells(i, j + 2) = Format(g(x), "#0.0###")

End If

i = i + 1

Next x

End Sub

Private Sub CommandButton7_Click()

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim x() As Double

Dim y() As Double

Dim w As String

w = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")

If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 19), Cells(28, 21)) = Clear

‘If w = "Y" Then Range(Columns(1), Rows(19)) = Clear

xn = InputBox("xn =", "Введите начало диапазона", -3)

xk = InputBox("xk =", "Введите конец диапазона", 7)

xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)

i = InputBox("i =", "Введите начало таблицы, строку", 7)

j = InputBox("j =", "Введите начало таблицы, столбец", 19)

Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"

i = i + 1

i0 = i

ReDim x((xk - xn) / xd)

ReDim y((xk - xn) / xd)

For k = 0 To (xk - xn) / xd

x(k) = xn + k * xd

y(k) = g(x(k))

Next k

For Each n In x

Cells(i, j) = Format(n, "0.0#")

i = i + 1

Next n

i = i0

k = 0

For Each n In y

If x(k) <= 0 Then Cells(i, j + 1) = Format(n, "#0.0###") Else Cells(i, j + 2) = Format(n, "#0.0###")

i = i + 1

k = k + 1

Next n

End Sub

Private Sub CommandButton1_Click()

Dim i As Integer

Dim j As Integer

Dim x As Single

Dim xn As Single

Dim xk As Single

Dim dx As Single

Xn=InputBox(“Xn=”,”Ввод начального значения X”,-2, 8000, 2000)

Xk=InputBox(“Xk=”,”Ввод конечного значения X”, 3, 800,1000)

Dx=Input(“dX=”,”Ввод значения шага X”, 0.5, 8000, 2000)

I=InputBox(“i=”,”Ввод начала таблицы, строка i”, 1, 8000, 1000)

J=InputBox(“j=”,”Ввод начала, столбец j”, 1, 8000, 2000)

X=xn: Cells(i, j)=”X”: Cells(i, j+1)=”Y”

10 y=x^2

Cells(i+1, j)=x

Cells(i+1, j+1)=y

x=x+dx

i=i+1

If x>xk Then GoTo 20 Else GoTo 10

20 End Sub

Некоторые комментарии к программе:

– Объявление простых переменных, строго говоря, в VBA не требуется, но бывают случаи, когда именно из-за этого программа работает не правильно или не работает вообще;

– В операторе InputBox используются пять параметров, первые два – символьные константы, их использование объясняется при появлении окна InputBox, третий параметр – предлагаемое значение, которое можно изменить, четвертый и пятый параметры – координаты левого верхнего угла окна InputBox на экране;

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