
Обработка_данных_ОЗО / Лабораторные_работы / Лабораторная_работа_4
.docЛабораторная работа 4. Использование VBA
Задание
1. В Microsoft Excel
разработать игру для угадывания
четырехзначного числа (рис. 1).
Суть данной игры заключается в следующем: компьютер загадывает четырехзначное число, а пользователь пытается его отгадать, при этом каждая цифра данного числа (от 0 до 9) угадывается по отдельности. Если цифра угадано правильно, для пользователя выдается сообщение «П» - правильно, если цифра угадана неправильно, то значения в ячейках могут быть «М» - данная цифра присутствует в данном числе, но она находится на другом месте, «Н» - данной цифры в этом числе нет.
Например, при нажатии на кнопку «Загадать» компьютер загадывает число.
При
попытке пользователя отгадать данное
число (нажать на кнопку «Проверить»)
выдаются следующие результаты: «Н –
такого числа нет» (следовательно, в
данном числе нет цифр 1, 3, 4), но имеется
цифра 2, однако она стоит на другом месте
(рис. 2), а также сообщение «Попробуй
еще!».
При следующей попытке отгадать число выводится следующий результат (рис. 3).
На заключительном этапе, когда пользователь отгадал число, выдается сообщение (рис. 4).
Задания для студентов
-
Создать и оформить в M. Excel поле для данной игры (см. рис. 1).
-
Выставить ленту «Разработчик».
-
На вкладке «Вставить» ленты «Разработчик» выставить 2 кнопки.
-
Для кнопки «Загадать» в редакторе VB написать программу для загадывания числа
Sub макрос 1()
r = 0
For i = 1 To 4
a(i) = Int(Rnd() * 10)
Sheets("Лист2").Cells(3, i + 1) = a(i)
Next
End Sub
Согласно данной программе компьютер загадывает каждую цифру числа от 0 до 9 и выводит на лист 2, где
Sheets("Лист2").Cells(3, i + 1) = a(i)
Соответственно первая цифра числа, загаданное ПК будет находится на листе 2, в ячейке с номером строки 3 и номером столбца 2 (В), вторая цифра числа в ячейке С3 и т.д.
Так как мы загадываем каждую цифру числа, то необходимо описать переменную a(i) и переменную цикла r:
Dim a(4) As Integer
Dim r As Integer
Назначьте кнопке «Загадать» - макрос 1 и проверьте как работает программа.
-
Для работы кнопки «Проверить» напишем программу для угадывания цифр данного числа
Sub Макрос2 ()
For i = 1 To 4
If Sheets("Лист1").Cells(2, i + 1) = a(i) Then
Sheets("Лист").Cells(4, i + 1) = "П"
Else
t = 0
For j = 1 To 4
If Sheets("Лист1").Cells(2, i + 1) = a(j) Then
t = 1
End If
Next
If t > 0 Then
Sheets("Лист1").Cells(4, i + 1) = "М"
Else
Sheets("Лист1").Cells(4, i + 1) = "Н"
End If
End If
Next
For i = 1 To 4
If Sheets("Лист1").Cells(4, i + 1) = "П" Then
f = f + 1
End If
Next
If f < 4 Then
MsgBox "Попробуй еще", 64, "Выводы"
End If
End Sub
-
Самостоятельно дополните данную программу: рассчитайте количество шагов, за которое пользователь отгадывает данное число, и выведите правильное число (см. рис. 4). Указание: правильное число компьютер выводит при F=4, в противном случает, надпись «попробуй еще». Для расчета количества шагов введите дополнительный счетчик.
-
Создайте кнопку для очистки цифр данного числа и напишите примечания, что обозначают буквы «П», «М», «Н» (рис. 5).
-
С
оздайте дополнительно кнопку «Инструкция», при нажатии на которую создаётся окно с пояснениями для действий пользователя (рис. 6).
Создание пользовательских функций, процедур и их использование
-
Создайте следующую таблицу
Создадим пользовательские функции для расчета Уральского коэффициента и подоходного налога. Для этого запишите их в модуле книги:
Если вы все сделали верно, то ваши пользовательские функции появятся в стандартном модуле функций (Вставка/Функция/Функции, определенные пользователем).
Задание для самостоятельной работы
-
Самостоятельно создайте функцию для расчета «На руки».
-
Используя процедуру, смены цвета создайте макрос позволяющий менять на красный цвет итоговые отрицательные суммы и на зеленый итоговые суммы более 10000р.
Проект «Эпидемия гриппа»
-
Создайте на первом листе «Эпидемия» клеточный автомат размером 25*25 клеток. Подготовьте область ввода исходных данных и область наблюдения за текущими результатами. Добавьте также три командные кнопки «Расставить случайно», «Один такт» и «20 тактов» (см. рис).
-
На втором листе подготовить область размером 25*25 для хранения информации с первого листа. Назовите данный лист «Копия» (см. рис).
-
Ввести программный код на кнопку «Расставить случайно»
Dim r As Range, rc As Range
Dim kz, n, nimm, nbol, pb, day
Private Sub CommandButton1_Click()
Rem n-общее число людей, kz-коэффициент заражения,nimm-число людей с иммунитетом
Rem nbolчисло больных на текущий момент, pb-всего переболело на текущий момент времени
kz = Cells(2, 29): n = Cells(3, 29): If n > 625 Then n = 625
nimm = Cells(4, 29): nbol = Cells(5, 29): pb = nbol
Cells(8, 29) = nbol: Cells(9, 29) = pb: Cells(10, 29) = n - nimm - pb
Set r = Range("B2:Z26")
Rem очистка клеточного автомата
For y = 1 To 25: For x = 1 To 25
r.Cells(y, x) = "": r.Cells(y, x).Interior.ColorIndex = 0
Next x, y
Rem занесение в автомат здоровых людей
For i = 1 To n - nimm - nbol
x = Int(Rnd * 25) + 1: y = Int(Rnd * 25) + 1
While r.Cells(y, x) <> "": x = Int(Rnd * 25) + 1: y = Int(Rnd * 25) + 1: Wend
r.Cells(y, x) = 0: r.Cells(y, x).Interior.ColorIndex = 6
Next i
Rem занесение в автомат людей с иммунитетом, привитых
For i = 1 To nimm
x = Int(Rnd * 25) + 1: y = Int(Rnd * 25) + 1
While r.Cells(y, x) <> "": x = Int(Rnd * 25) + 1: y = Int(Rnd * 25) + 1: Wend
r.Cells(y, x) = 8: r.Cells(y, x).Interior.ColorIndex = 12
Next i
Rem занесение в автомат больных людей
For i = 1 To nbol
x = Int(Rnd * 25) + 1: y = Int(Rnd * 25) + 1
While r.Cells(y, x) <> "": x = Int(Rnd * 25) + 1: y = Int(Rnd * 25) + 1: Wend
r.Cells(y, x) = 1: r.Cells(y, x).Interior.ColorIndex = 5
Next i
End Sub
Проверьте работоспособность данной кнопки, при этом у нас имеются следующие обозначения
«» - нет человека.
«0» - здоровый человек без иммунитета;
«1» … «7» - больной человек, число соответствует номеру дня болезни.
«8» - человек с иммунитетом.
-
Напишем программный код на кнопку «Один такт», которая соответствует одному дню развития эпидемии.
Private Sub CommandButton2_Click()
kz = Cells(2, 29): n = Cells(3, 29)
nimm = Cells(4, 29): nbol = Cells(8, 29): pb = Cells(9, 29)
Set r = Range("B2:Z26")
Set rc = Worksheets("Копия").Range("B2:Z26")
Rem Копируем данные на лист «копия»
r.Copy Destination:=Worksheets("Копия").Range("B2")
Rem B цикле просматривается содержимое копии
For y = 1 To 25: For x = 1 To 25
If rc.Cells(y, x) <> "" Then
d = rc.Cells(y, x)
Rem если в клетке больной человек, то увеличиваем на единицу (прошел день)
If d > 0 And d < 7 Then
r.Cells(y, x) = r.Cells(y, x) + 1
Rem если в клетке выздоравливающий (проболел 7 дней), то переводим Rem его в разряд с иммунитетом
ElseIf d = 7 Then
r.Cells(y, x) = 8: r.Cells(y, x).Interior.ColorIndex = 12
nbol = nbol - 1: Cells(8, 29) = nbol
Rem если в клетке здоровый человек без иммунитета, а рядом больной
Rem то он заболевает соответственно коэффициенту заражения и числу
Rem больных соседей
ElseIf d = 0 Then
b = False: p = Rnd
If rc.Cells(y, x + 1) > 0 And rc.Cells(y, x + 1) < 8 And p < kz Then b = True
If rc.Cells(y, x - 1) > 0 And rc.Cells(y, x - 1) < 8 And p < kz Then b = True
If rc.Cells(y + 1, x) > 0 And rc.Cells(y + 1, x) < 8 And p < kz Then b = True
If rc.Cells(y - 1, x) > 0 And rc.Cells(y - 1, x) < 8 And p < kz Then b = True
If b = True Then
r.Cells(y, x) = 1: r.Cells(y, x).Interior.ColorIndex = 5
nbol = nbol + 1: pb = pb + 1: Cells(8, 29) = nbol: Cells(9, 29) = pb
Cells(10, 29) = n - nimm - pb
End If
End If
End If
Next x, y
End Sub
-
На кнопку «20 тактов» напишите следующий программный код
-
Построим график для исследования динамики численности больных от номера дня. Добавим код для кнопки 1 в конец программы
Для кнопки 2
Указание: на первом листе мы выделили диапазон данных, на которых будет строиться график А31:В181. На командной кнопке «Расставить случайно» мы добавили код для очистки области данных для графика, а на кнопке2 добавили код для заполнения этой области необходимыми данными.
-
Постройте самостоятельно график соответственно диапазону А31:В181.
Задания для самостоятельной работы
-
Исследуйте как меняется картина протекания эпидемии при низкой плотности населения (300 человек).
-
Исследуйте, как меняется картина при низком коэффициенте заражения.
-
Измените проект, чтобы в исходных данных появилась строка «длительность болезни».