Решение уравнений с помощью vba

Урок № 15. Сводим всё вместе

Сводим всё вместе

В этом уроке мы попробуем написать нашу первую программу на Visual Basic — программу для решения квадратных уравнений. Может быть эта программа и не очень полезна в хозяйстве, но она хорошо вас ознакомит с принципами программирования на VB. Итак, приступим. Всмомним из урока 5 основные этапы разработки приложение на Visual Basic:

  1. Продумывание программы
  2. Проектирование интерфейса
  3. Написание программного кода
  4. Отлаживание программы
  5. Окончательная компиляция

Программу будем писать согласно этим пунктам:

1. Продумывание программы.

Что должна делать наша программа? — решать квадратные уравнения. Вспомним, как решаются квадратные уравнения.

Чтобы решить такое уравнение, нужно найти его дискриминант и затем, корни. Дискрименант ищется по формуле:

Если дискриминант > 0, то

X1 = (b + (корень из D)) / 2*a
X2 = (b — (корень из D)) / 2*a

Если дискриминант = 0, то

Если дискриминант Назначение элемента управления

A: — параметр AtxtParamAB: — параметр BtxtParamBC: — параметр CtxtParamCКнопка для запуска решенияcmdCalculateLabel, с вычисленным дискриминантомlblDLabel, с корнем X1lblX1Label, с корнем X2lblX2Форма, содержащая все эти элементыfrmMain

Остальные элементы переименовывать не обязательно, т.к. мы к ним не будем обращаться в коде программы. Но, если хотите, можете переименовать. Приучайтесь к этому.

Интерфейс готов. Он конечно не претендует на звание самого удобного и красивого интерфейса года ;), но для начала сойдёт. Всё равно, в дальнейшем, уже после написания кода программы, вы сможете изменить интерфейс по вашему вкусу.

3. Написание программного кода.

Теперь самое интересное! Мы будет писать код для нашей программы! Давайте ещё раз продумаем алгоритм работы программы:

    Вводим исходные данные в тектовые поля (a,b,c). Напомню, что код для этого писать не нужно. За нас всё сделает Visual Basic и Windows. В этом то и заключается прелесть графического интерфейса пользователя (GUI). Мы только считаем введенные значения и всё.

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

  • Выводим полученные значения в метки (Label’и).
  • Нам необходимо написать обработчик события клик (Click) нашей кнопки — cmdCalculate. Что значит обработчик события? Обработчик события — это процедура, которая будет выполняться всякий раз, когда произойдёт то или иное событие. Например собите Click. Оно происходит всякий раз при нажатии на кнопку. Т.е., если запустить программу на выполнение и не нажимать на кнопку cmdCalculate ничего не произойдёт. Но как только вы кликните по кнопке, произойдёт выполнение кода, который написан в процедуре обработки события Click (процедуре с именем cmdCalculate_Click). Он будет выполняться всякий раз, когда пользователь кликнет по кнопке. В этом то и состоит та самая Событийно-Управляемая модель программирования, которая отличается от плоских последовательных программ (Turbo Паскаля, например). Программирование на Visual Basic целиком и полностью базируется на этой Событийно-Управяемой модели.

    Надеюсь, что вы уловили мою мысль. Если нет, то не отчаивайтесь, далее всё станет понятно.

    Чтобы создать обработчик события Click необходимо сделать двойной клик по нашей кнопке cmdCalculate (при двойном клике, VB создаёт заготовку обработчика события — по-умолчанию. У кнопки, это событие Click, у формы — Load, у таймера — Timer и т.д.). Visual Basic создаст для вас заготовку процедуры, которая будет выглядеть следующим образом:

    Private Sub cmdCalculate_Click()

    Чтобы создать обработчик для другого события, необходимо выбрать событие в правом списке в окне кода:

    В списке довольно много различных событий. В левом списке вы можете выбрать доступные элементы управления, которые помещены на форму. В данном случае в списке вы видите cmdCalculate. Очень удобно.

    Так же, как и некоторое свойства элементов управления, события тоже повторяются. Например, событие Click. Оно есть и у элемента кнопки (Command Button), и у элемента метки (Label) и у многих других. Есть оно и у формы. Это очень облегчает процесс программирования. Не нужно тратить много времени на изучение каждого элемента управления, т.к. многое повторяется.

    Заметьте также, что у процедуры обработки события Click нет входных параметров, о чём нам говорят пустые скобки. Добавить свои параметры в эту процедуру нельзя. У процедур обработки некоторых других событий могут быть параметры. Например, у события MouseMove (координаты курсора мыши) или KeyUp (код отжатой клавиши). Эти параметры передаются незаметно для программиста, и их можно использовать по своему усмотрению (а можно и вовсе не использовать).

    Теперь давайте приступим непосредственно к программированию. Для начала объявим переменные с типом Double (для хранения вещественных чисел):

    Private Sub cmdCalculate_Click()
    &nbsp&nbsp&nbsp&nbsp’ объявляем переменные
    &nbsp&nbsp&nbsp&nbsp Dim paramA As Double
    &nbsp&nbsp&nbsp&nbspDim paramB As Double
    &nbsp&nbsp&nbsp&nbspDim paramC As Double

    &nbsp&nbsp&nbsp&nbspDim x1 As Double
    &nbsp&nbsp&nbsp&nbspDim x2 As Double
    &nbsp&nbsp&nbsp&nbspDim D As Double
    End Sub

    Теперь считаем введённые параметры a, b и с. Для этого присвоим переменным paramA, paramB и paramC значения свойства Text всех 3-х полей для ввода (TextBox’ов). Мы можем это сделать потому, что Visual Basic сам преобразует число в виде строки в обычное число с плавающей точкой.

    paramA = txtParamA.Text
    paramB = txtParamB.Text
    paramC = txtParamC.Text

    Доступ к свойству любого элемента управления осуществляется через точку, которая разделяет имя свойства и имя элемента. Обратите внимание на технологию Intellisence. Visual Basic выдает список доступных свойств этого элемента управления. Это очень удобно. Вам не придётся выучивать наизусть длинные и сложные названия свойств. Достаточно выбрать нужное свойство из списка и всё.

    Теперь нам нужно рассчитать дискриминант. Для этого присвоим переменной D, которая будет хранить значение дискриминанта, следующее выражение:

    D = (paramB * paramB) — (4 * paramA * paramC)

    Скобки я поставил для наглядности. Ставить их в данном случае не обязательно, т.к. умножение всё равно выполниться до вычитания. (вспомните, что умножение имеет больший приоритет, чем вычитание).

    Теперь, зная значение дискриминанта, нужно сравнить его с нулём. Если он больше нуля, то вычислить оба корня, если равен нулю, то вычислить один корень, ну а если меньше, то ничего не вычислять и выдать сообщение о том, что корней нет. Такое ветвление мы организуем с помощью оператора If:

    If D > 0 Then
    &nbsp&nbsp&nbsp&nbspx1 = (paramB + Sqr(D)) / (2 * paramA)
    &nbsp&nbsp&nbsp&nbspx2 = (paramB — Sqr(D)) / (2 * paramA)
    &nbsp&nbsp&nbsp&nbsplblD.Caption = «Дискременант: » & D
    &nbsp&nbsp&nbsp&nbsplblX1.Caption = «Корень №1: » & x1
    &nbsp&nbsp&nbsp&nbsplblX2.Caption = «Корень №2: » & x2
    ElseIf D = 0 Then
    &nbsp&nbsp&nbsp&nbspx1 = paramB / (2 * paramA)
    &nbsp&nbsp&nbsp&nbspx2 = x1
    &nbsp&nbsp&nbsp&nbsplblD.Caption = «Дискременант: » & D
    &nbsp&nbsp&nbsp&nbsplblX1.Caption = «Корень №1: » & x1
    &nbsp&nbsp&nbsp&nbsplblX2.Caption = «Корень №2 = Корню №1»
    ElseIf D Then
    &nbsp&nbsp&nbsp&nbsplblD.Caption = «Дискременант: » & D
    &nbsp&nbsp&nbsp&nbsplblX1.Caption = «Корней нет!»
    &nbsp&nbsp&nbsp&nbsplblX2.Caption = «»
    &nbsp&nbsp&nbsp&nbspMsgBox «Дискременант меньше нуля! Корней нет!», vbCritical
    End If

    Не забывайте про отступы! С ними код намного нагляднее.

    Корень мы вычисляем встроенной функцией VB — Sqr (от Square). В выражениях, которые мы присваиваем свойству Caption у меток, мы используем оператор конкатенации (склеивание строк). Им мы склеиваем строку слева от & со строкой справа. Откуда берётся строка справа? Ведь там переменные типа Double!? Как я уже говорил, Visual Basic неявно занимается преобразованием типов. В данном случае перед конкатенацией, числа Double сначала преобразуются в строку.

    В принципе, программа уже готова. Давайте проверим её работоспособность. Нажмите кнопку Start. Появится наша форма. Введите значение в поля: a = 3, b = -6, c = 2. Нажмите на кнопку «Решить!». Если вы всё делати правильно, то должны увидеть следующую картину:

    Дело в том, что строка для вывода в Label не вписывается в его размеры. Поэтому происходит перенос на следующую строчку. Чтобы этого избежать, закройте программу и установите свойство меток AutoSize в True (Совет: Чтобы не устанавливать это свойство 3 раза для каждой метки, выдели их сразу все 3 и установите свойство.). Свойство AutoSize — подгоняет размер метки так, чтобы текст в свойстве Caption полностью уместился в одну строчку и не переносился на другую. Теперь снова запустите программу, введите те же значения и нажмите на кнопку:

    Теперь всё в порядке! Программа работает! Можете поэкперементировать, вводя разные значения коэффициентов.

    Но, обратите внимение! Что произойдёт, если мы, не введя значения в поля , нажмём на кнопку? Что тогда присвоиться нашим переменным? Или, что будет, если мы введём нули в качестве коэффициентов? В обоих случаях Visual Basic сгенерирует ошибку. Почему? Ответ на этот вопрос мы разберём на следующем уроке.

    Пример простейших макросов

    Простейшие макросы

    Программирование в VBA ничем принципиально не отличается от большинства других языков программирования, если не использовать визуальные средства.

    Язык программирования Бейсик, вернее, один из его диалектов или версий является частью VBA.

    Когда вы программируете на VBA, то можете, также как и в Бейсик, вообще не описывать предварительно переменные, используемые в программе, чего Вы не можете сделать, например, в Паскале.

    VBA – это разновидность VB для приложений. VBA встроен в Application Word, Excel, Power Point, Access.

    Для каждого приложения есть свои нюансы VBA.

    С помощью VBA приложения можно связывать между собой, вызывая в одной программе разные приложения и передавая данные между ними.

    Такой процесс называется Автоматизацией. То приложение, откуда данные берутся, выступает в роли сервера, а то приложение, куда данные вставляются, играет роль клиента.

    Лучше всего для сервера подходит Excel, а для клиента – Word.

    Переменные, описанные с помощью оператора Dim, являются локальными, и действуют лишь внутри объявляемого модуля.

    Переменные, объявленные как Public, действуют во всех программных модулях и доступны из любого модуля.

    Значения Public не надо передавать другим модулям, так как они всегда доступны по их имени. Локальные переменные можно передавать другим модулям при их вызове.

    Если вы работаете в Excel, то есть одна тонкость при обработке вещественных (с десятичной точкой) чисел.

    Чаще всего на листе Excel числа набираются через запятую, а VBA такие числа воспринимает через точку. Поэтому десятичные числа лучше с листа считывать в символьные переменные, а затем программным способом менять запятую на точку. Тогда ошибок не будет наверняка.

    Если Вы хотите, чтобы в VBA нельзя было использовать не объявленные переменные, как в Паскале, то надо перед программой поставить режим Explicit в виде команды Option Explicit.

    Давайте рассмотрим простейшую программу по решению квадратных уравнений с использованием алгоритма, известного из школы.

    Эту задачу средствами VBA в EXCEL можно решить минимум тремя или четырьмя способами.

    Первый способ использует ввод и вывод данных на самом листе Excel.

    Sub koren1()

    Dim a As Integer

    Dim b As Integer

    Dim c As Integer

    Dim d As Integer

    Dim x1 As Integer

    Dim x2 As Integer

    ‘ Тип данных можно сделать Long для больших целых чисел

    ‘ или Double для вещественных чисел

    ‘ или Variant для чисел любого типа

    ‘ Изменяя тип переменных, можно решать задачу в разных диапазонах данных

    ‘ читаем значения чисел в переменные

    i = 2 ‘Задаем номер строки

    a = Cells(i, 1)

    b = Cells(i, 2)

    c = Cells(i, 3)

    d = b * b – 4 * a * c ‘Вычисляем дискриминант

    ‘Выводим его значение в строку 2, столбец 4

    Cells(i, 4) = d

    ‘Применяем условие для решения квадратных уравнений

    If d >= 0 Then

    MsgBox “Решение есть”

    x1 = (-b – Sqr(d)) / (2 * a)

    x2 = (-b + Sqr(d)) / (2 * a)

    Cells(i, 5) = x1

    Cells(i, 6) = x2

    Else

    MsgBox “Решений нет”

    End If

    End Sub

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

    Dim a As Integer

    Dim b As Integer

    Dim c As Integer

    Dim d As Integer

    Dim x1 As Integer

    Dim x2 As Integer

    ‘ Тип данных можно сделать Long для больших целых чисел

    ‘ или Double для вещественных чисел

    ‘ или Variant для чисел любого типа

    ‘ Изменяя тип переменных, можно решать задачу в разных диапазонах данных

    ‘ Заносим значения чисел в переменные

    MsgBox “Коэф. A=” + CStr(a) + vbCr + “Коэф. B=” + CStr(b) + vbCr + “Коэф. C=” + CStr(c)

    d = b * b – 4 * a * c ‘Вычисляем дискриминант

    ‘Выводим его значение в строку 2, столбец 4

    MsgBox “Коэф. A=” + CStr(a) + vbCr + “Коэф. B=” + CStr(b) + vbCr + “Коэф. C=” + CStr(c) + vbCr + _

    Дискриминант D=B*B-4*A*C= + CStr(d)

    ‘Обращаю внмание на вывод нестроковых значений в операторе Msgbox

    ‘ Значение надо преобразовать в строковый тип данных

    ‘Применяем условие для решения квадратных уравнений

    MsgBox “Решение есть”

    x1 = (-b – Sqr(d)) / (2 * a)

    x2 = (-b + Sqr(d)) / (2 * a)

    MsgBox “Корень x1=” + CStr(x1) + vbCr + “Корень x2=” + CStr(x2)

    MsgBox “Решений нет”

    Решим задачу 3-м способом, получая значения путем их ввода в интерактивном режиме непосредственно в программу.

    Dim a As Integer

    Dim b As Integer

    Dim c As Integer

    Dim d As Integer

    Dim x1 As Integer

    Dim x2 As Integer

    Dim a1 As String

    ‘ Тип данных можно сделать Long для больших целых чисел

    ‘ или Double для вещественных чисел

    ‘ или Variant для чисел любого типа

    ‘ Изменяя тип переменных, можно решать задачу в разных диапазонах данных

    ‘ Вводим значения в переменные

    a1 = InputBox(“Введите значение коэф.А”, “Ввод коэффициента”, 1)

    a1 = InputBox(“Введите значение коэф.B”, “Ввод коэффициента”, 2)

    a1 = InputBox(“Введите значение коэф.C”, “Ввод коэффициента”, -35)

    If a = 0 Then MsgBox “Уравнение имеет одно решение”

    ‘MsgBox “Коэф. A=” + CStr(a) + vbCr + “Коэф. B=” + CStr(b) + vbCr + “Коэф. C=” + CStr(c)

    d = b * b – 4 * a * c ‘Вычисляем дискриминант

    ‘Выводим его значение в строку 2, столбец 4

    MsgBox “Коэф. A=” + CStr(a) + vbCr + “Коэф. B=” + CStr(b) + vbCr + “Коэф. C=” + CStr(c) + vbCr + _

    Дискриминант D=B*B-4*A*C= + CStr(d)

    ‘Обращаю внмание на вывод нестроковых значений в операторе Msgbox

    ‘ Значение надо преобразовать в строковый тип данных

    ‘Применяем условие для решения квадратных уравнений

    MsgBox “Решение есть”

    x1 = (-b – Sqr(d)) / (2 * a)

    x2 = (-b + Sqr(d)) / (2 * a)

    MsgBox “Корень x1=” + CStr(x1) + vbCr + “Корень x2=” + CStr(x2)

    MsgBox “Решений нет”

    Решим задачу 4-м способом, получая значения путем их ввода в форму пользователя непосредственно в программе.

    Создаем форму пользователя Userform1

    В форме располагаем несколько меток и текстовых окон, а также две командные кнопки.

    По каждой кнопке вызывается исполняемый модуль

    Текстовые окна имеют имена Koef_A, Koef_B, Koef_C, Disk_D, Koren_x1 и Koren_x2

    Командные кнопки имеют имена cmdRun и cmdExit.

    Private Sub cmdExit_Click()

    Private Sub CmdRun_Click()

    Dim a As Double

    Dim b As Double

    Dim c As Double

    Dim d As Double

    Dim x1 As Double

    Dim x2 As Double

    Dim a1 As Double

    ‘ Тип данных можно сделать Long для больших целых чисел

    ‘ или Double для вещественных чисел

    ‘ или Variant для чисел любого типа

    ‘ Изменяя тип переменных, можно решать задачу в разных диапазонах данных

    ‘ Вводим значения в переменные

    If Trim(UserForm1.Koef_A) = “” Or Trim(UserForm1.Koef_B) = “” Or Trim(UserForm1.Koef_C) = “” Then

    MsgBox “Введите значения коэффициентов”

    If a = 0 Then MsgBox “Уравнение имеет одно решение”

    d = b * b – 4 * a * c ‘Вычисляем дискриминант

    ‘Выводим его значение в строку 2, столбец 4

    UserForm1.Disk_D = UserForm1.Koef_B + “*” + UserForm1.Koef_B + “-” + _

    4* + UserForm1.Koef_A + ” *” + UserForm1.Koef_C + “=” + CStr(d)

    ‘Обращаю внмание на вывод нестроковых значений в операторе Msgbox

    ‘ Значение надо преобразовать в строковый тип данных

    ‘Применяем условие для решения квадратных уравнений

    Решение уравнения на Vb

    Решение уравнений на Vb методом полного перебора

    На этом уроке мы напишем программу на vb, которая ищет корни уравнения методом полного перебора. В этой программе мы будем использовать вложенные циклы For и выводить информацию с помощью элемента ListBox.
    Искать решение уравнения будем простым перебором всех значений в заданном диапазоне. Пользователь задает диапазоны поиска, решения выводятся в специальную область на форме ListBox

    Создадим интерфейс программы
    1 Разместим два элемента TextBox на форме для задания диапазонов диапазонов поиска решения. Разместим элементы метки Label для надписей к диапазонам. Подробно познакомится с этим элементами можно на уроке Текстовые поля
    2 В Toolbox находим элемент ListBox, размещаем его на форме.

    3. Разместим элемент Button и назовём его Вычислить Подробно о кнопках в Vb. В итоге получаем интерфейс.

    Нажимаем два раза на кнопку, переходим в функцию обработки нажатия кнопки Посчитать.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    End Sub

    Введём переменные: x, d, lowerBound, upperBound, где x — значение аргумента в данной точке, d – шаг перебора x, lowerBound — нижняя граница поиска, а upperBound — верхняя граница поиска. Для опеределения диапазона поиска решений будем использовать текстовые поля TextBox1 и TextBox2. Чтобы считать значения, введенные в эти поля, используется свойство этих элементов Техt

    Dim x, d, lowerBound, upperBound As Double
    d = 0.5
    lowerBound = TextBox1.Text
    upperBound = TextBox2.Text
    В начале программы необходимо очистить поле выводов ответов ListBox с помощью команды
    ListBox1.Items.Clear()
    Мы решаем уравнение методом перебора. Для осуществления перебора используем цикл For
    For переменная= нижняя граница перебора To верхняя граница перебора Step шаг перебора

    Next переменная
    В нашем случае цикл перебора переменной x от нижней границы lowerBound до верхней границы upperBound будет выглядеть
    For x = lowerBound To upperBound Step d

    Next x

    В самом цикле при каждом новом значении x проверяем, является ли оно решением уравнения. Для этого необходимо использовать условие If. Для примера выберем уравнение

    Цикл перебора для поиска корней этого уравнения на vb будет выглядеть следующим образом

    For x = lowerBound To upperBound Step d
    If Math.Pow(x, 3) + Math.Pow(x, 2) + x + 1 = 0 Then
    ListBox1.Items.Add(x)
    End If
    Next x
    Теперь разберем алгоритм решения уравнений с двумя переменными x и y. Например

    Для этого нужно перебирать не только x, но и y. Чтобы перебрать все значения и x, и y, необходимо сделать вложенный цикл For.

    Вложенные циклы для перебора всех значений переменной x и y и поиска решений уравнения
    For x = lowerBound To upperBound Step d
    For y = lowerBound To upperBound Step d
    If 4 * x = Math.Pow(y, 2) Then
    ListBox1.Items.Add(x & vbTab & y)
    End If
    Next y
    Next x
    Полная версия программы решения уравнения с двумя переменными методом перебора на VB
    Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim x, d, lowerBound, upperBound As Double
    d = 0.5
    lowerBound = TextBox1.Text
    upperBound = TextBox2.Text
    ListBox1.Items.Clear()
    ListBox1.Items.Add(«x:» & vbTab & «y:»)
    For x = lowerBound To upperBound Step d
    For y = lowerBound To upperBound Step d
    If 4 * x = Math.Pow(y, 2) Then
    ListBox1.Items.Add(x & vbTab & y)
    End If
    Next y
    Next x
    End Sub
    End Class
    Задание. Напишите программу для поиска решения уравнений с тремя неизвестными.

    Полезно почитать по теме циклы в Vb
    Циклы в VB


    источники:

    http://amcher.ru/2014/11/12/primer-prostejshih-makrosov/

    http://itrobo.ru/programmirovanie/osnovy-vb/reshenie-uravnenija-na-vb.html