Вычисление числа p методом Монте-Карло Задача: с помощью датчика случайных чисел вычислить координаты N точек, равномерно распределенных внутри квадрата со стороной 2. Подсчитать число точек N1 точек попавших внутрь круга, вписанного в этот квадрат. Считая, что числа N и N1 пропорциональны площади квадрата и круга соответственно, вычислить приближенное значение числа pпо формуле p » 4×N1/ N.
На рис.37 показана экранная форма с графическим окном PictureBox, в которое выводятся точки красного цвета, если они попадают внутрь круга и синим, если вне его. В левое текстовое окно вводится число N, а в правое – результат вычислений, приближенное значение числа p. Текст программы на рис.38.
Рис. 37. Экранная форма проекта «Метод Монте-Карло»
Private Sub Command1_Click()
Picture1.Scale (-1, 1)-(1, -1) ‘ масштабирование окна
Picture1.Line (-1, 1)-(1, -1), vbWhite, BF ‘ закрашивание окна
N = Val(Text1.Text) ‘ N – количество точек
N1 = 0 ‘ N1 – счетчик попаданий в круг
Randomize ' инициализация датчика случайных чисел
For i = 1 To N ‘ цикл вычисления координат точек
XT = 2 * Rnd - 1
YT = 2 * Rnd - 1
If XT * XT + YT * YT < 1 Then ‘ если точка попадает в круг
N1 = N1 + 1 ‘ счетчик увеличивается на единицу
Picture1.PSet (XT, YT), vbRed ‘ рисуется точка красного цвета
Else ‘ в противном случае
Picture1.PSet (XT, YT), vbBlue ‘ рисуется точка синего цвета
End If
ProgressBar1.Value = i / N ‘ обновляется индикатор
Next i
PI = 4 * N1 / N ‘ вычисляется число пи
Text2.Text = Str(PI)
End Sub
Рис.38. Программа вычисления числа вода точек графика функции
Поскольку при больших значениях N расчеты могут занять несколько секунд, на форме размещен индикатор выполнения программы, элемент ProgressBar (полоска, в которой количество закрашенных прямоугольников пропорционально количеству выполненных шагов цикла, а не закрашенных – количеству оставшихся шагов. Элемент ProgressBar изначально отсутствует в панели инструментов Visual Basic, для того, чтобы разместить его на форме, необходимо предварительно выбрать компонент CommonDiaalg 6 (см. раздел 12). В окне свойств элемента ProgressBar нужно задать свойства min=0 и max=1, а в программе изменять значение свойства Value с помощью выражения
ProgressBar1.Value = i / N
где i – параметр цикла типа пересчета, N – конечное значение параметра цикла.
Проект «Часы».
Задача: через каждую секунду нужно определять текущее время и отображать его в графическом окне в виде аналоговых часов, и в текстовом окне в виде цифровых часов.
На рис.39 показана экранная форма, а на рис.40 – программный код.
Рис.39. Экранная форма проекта «Часы»
Private Sub Timer1_Timer()
Dim h As Integer
Dim m As Integer
Dim s As Integer
Dim n As Integer
h = Hour(Now) ‘ текущий час
m = Minute(Now) ‘ текущая минута
s = Second(Now) ‘ текущая секунда
n = Int(m / 12)
Text1.Text = Format(Now, "hh:mm:ss") ‘ вывод текущего времени
Picture1.Scale (-5, 5)-(5, -5)
Picture1.Cls ‘ очистка графического окна
Picture1.BackColor = vbCyan
Tsiferblat ‘ вызов процедуры вычерчивания циферблата
Picture1.DrawWidth = 1 ‘ вычерчивание секундной стрелки
Picture1.Line (0, 0)-(4 * Sin(6 * s * 3.14 / 180), 4 * Cos(6 * s * 3.14 / 180)), vbRed
Picture1.DrawWidth = 2 ‘ вычерчивание минутной стрелки
Picture1.Line (0, 0)-(3.5 * Sin(6 * m * 3.14 / 180), 3.5 * Cos(6 * m * 3.14 / 180)), vbBlack
Picture1.DrawWidth = 3 ‘ вычерчивание часовой стрелки
Picture1.Line (0, 0)-(3 * Sin((30 * h + 6 * n) * 3.14 / 180), 3 * Cos((30 * h + 6 * n) * 3.14 / 180)), vbBlack
End Sub
Рис.40. Текст процедуры Timer1_Timer()
Задача решается с помощью использования объекта Timer (см. раздел 10) . Экземпляру этого объекта, размещенному на форме присвоено имя Timer1.
Свойству Interval этого объекта задано значение 1000 мс (то есть одна секунда). Процедура Timer1_Timer() запускается через каждую секунду. Текст ее представлен на рис.40.
Текст процедуры Tsiferblatпредставлен на рис.41. С помощью этой процедуры прорисовывается элементы циферблата. Толстыми желтыми точками по окружности радиуса 4 показаны 12 часовых меток, между ними – четыре черные точки. Рядом с желтыми точками выведены числа от 1 до 12.
Sub Tsiferblat()
Dim i As Byte
For i = 0 To 60
If i Mod 5 = 0 Then
Picture1.DrawWidth = 5 ‘
Picture1.PSet (4 * Sin(6 * i * 3.14 / 180), 4 * Cos(6 * i * 3.14 / 180)), vbYellow
Else
Picture1.DrawWidth = 3
Picture1.PSet (4 * Sin(6 * i * 3.14 / 180), 4 * Cos(6 * i * 3.14 / 180)), vbBlack
End If
Next i
Picture1.DrawWidth = 1
Picture1.FontSize = 16
For i = 1 To 12
fi = (60 + i * 30) * 3.14 / 180
X = 4.5 * Cos(fi) - 0.3
Y = 4.5 * Sin(fi) + 0.3
If i < 4 Then
X = X - 0.2
End If
Picture1.PSet (X, Y), vbCyan
Picture1.Print 13 - i
Next i
End Sub
Рис.41. Текст процедуры Tsiferblat
Примечание. Рассмотренные в этом разделе проекты были выполнены студентами при изучении курса «Программирование и начала алгоритмизации». Следует отметить, что эти и другие задачи можно решить многими способами. Приведенные программные коды являются возможными вариантами решений и не претендуют на оптимальность в каком-либо смысле.
Рекомендуемая литература
1. Агеев В.Н. Информационное обеспечение систем управлении: учебное пособие / В.Н.Агеев.– М., 2009.– 162 с.
2. Курилович В. Visual Basic / В. Курилович.– М., 2006.– 284 с.
3. Сайлер Б., Споттс Дж.Использование Visual Basic 6 / Б. Сайлер, Дж.Споттс.– М., 2008.– 830 с.
4. Программирование и основы алгоритмизации: лабораторные работы.– М.: МГУП, 2009.– 38 с
|