Вычисление числа 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

 

Примечание. Рассмотренные в этом разделе проекты были выполнены студентами при изучении курса «Программирование и начала алгоритмизации». Следует отметить, что эти и другие задачи можно решить многими способами. Приведенные программные коды являются возможными вариантами решений и не претендуют на оптимальность в каком-либо смысле.

 








Дата добавления: 2016-02-11; просмотров: 1517;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.012 сек.