Нужно написать программу для решения квадратных уравнений на Visual Basic.
a*x*x + b*x + c = 0
Чтобы решить такое уравнение, нужно найти его дискриминант и затем, корни. Дискриминант ищется по формуле:
D = b*b - 4*a*c
А корни:
Если дискриминант > 0, то
X1 = (b + (корень из D)) / 2*a X2 = (b - (корень из D)) / 2*a
Если дискриминант = 0, то X1 = X2 = b / 2*a
Если дискриминант < 0, то корней не существует.
Входные данные в программу - коэффициенты a,b,c. Данные вводятся в текстовые поля для ввода (TextBox).
Выходные данные - корни (если они есть) и дискриминант. Данные вводятся в элемент метку (Label). Запускается решение нажатием на кнопку (Command Button).
Проектирование интерфейса программы.
Нужные элементы управления выделены красным цветом. Для чего нужны эти элементы? Элемент метка (Label) нужен для отображения текста. Т.е. служит как бы подсказкой. В нём мы будем выводить наш дискрименант и корни. Элемент текстовое поле (TextBox) предназначен для ввода пользователем информации. Введённую информации можно легко получить в коде программы. Для этого у TextBox есть свойство Text. Ну, и наконец, элемент кнопка (CommandButton), нужен для запуска некоторого действия. В нашем случае действием будет решение квадратного уравнения. А запускаться оно будет при нажатии на кнопку.
Размещаем элементы управления: Создал 3 элемента Label, 3 TextBox,
1 CommandButton.
У кнопки изменяем свойство Caption на "Решить!". Убираем кнопку развернуть. Кнопка развернуть нашей форме совсем не к чему. Для этого выделияем форму и в окне Properties отредактируем свойство BorderStyle. Вам предложат выбрать несколько значений из списка, а именно:
0-None - у формы не будет заголовка и кнопок управления. 1-Fixed Single - форма будет иметь заголовок и одну кнопку - закрыть. 2-Sizeable - задаётся по умолчанию. Форма имеет все 3 кнопки. 3-Fixed Dialog - то же, что и 1, но форму не будет видно на панели задач 4-Fixed ToolWindow - сокращённый вид заголовка и одна кнопка - закрыть 5-Sizeable ToolWindow - то же что и 4, но можно изменять размеры формы
Укажим 1 номер (Fixed Single).
Сделаем текст "Результаты решения" подчёркнутым. Для этого выделяем Label и находим в окне Properties свойство Font. В окне выбора шрифта поставим галочку - Подчёркнутый.
переименуем элементы управления. Для этого измените свойство Name каждого элемента управления согласно таблице:
Назначение элемента управления Имя (свойство Name)
A: - параметр A txtParamA
B: - параметр B txtParamB
C: - параметр C txtParamC
Кнопка для запуска решения cmdCalculate
Label, с вычисленным дискриминантом lblD
Label, с корнем X1 lblX1
Label, с корнем X2 lblX2
Форма, содержащая все эти элементы frmMain
Интерфейс готов.
Написание программного кода.
-
Вводим исходные данные в текстовые поля (a,b,c).
-
После нажатия на кнопку, производим вычисление дискриминанта и корней.
-
Выводим полученные значения в метки (Label'и).
Нам необходимо написать обработчик события клик (Click) нашей кнопки - cmdCalculate. Что значит обработчик события? Обработчик события - это процедура, которая будет выполняться всякий раз, когда произойдёт то или иное событие. Например событе Click.
Оно происходит всякий раз при нажатии на кнопку. Т.е., если запустить программу на выполнение и не нажимать на кнопку cmdCalculate ничего не произойдёт. Но как только вы кликните по кнопке, произойдёт выполнение кода, который написан в процедуре обработки события Click (процедуре с именем cmdCalculate_Click). Он будет выполняться всякий раз, когда пользователь кликнет по кнопке. В этом то и состоит та самая Событийно-Управляемая модель программирования, которая отличается от плоских последовательных программ (Turbo Паскаля, например). Программирование на Visual Basic целиком и полностью базируется на этой Событийно-Управяемой модели.
Чтобы создать обработчик события Click необходимо сделать двойной клик по нашей кнопке cmdCalculate (при двойном клике, VB создаёт заготовку обработчика события - по-умолчанию. У кнопки, это событие Click, у формы - Load, у таймера - Timer и т.д.). Visual Basic создаст для вас заготовку процедуры, которая будет выглядеть следующим образом:
Private Sub cmdCalculate_Click()
End Sub
как и некоторое свойства элементов управления, события тоже повторяются. Например, событие Click. Оно есть и у элемента кнопки (Command Button), и у элемента метки (Label) и у многих других. Есть оно и у формы. Это очень облегчает процесс программирования. Не нужно тратить много времени на изучение каждого элемента управления, т.к. многое повторяется.
Заметьте также, что у процедуры обработки события Click нет входных параметров, о чём нам говорят пустые скобки. Добавить свои параметры в эту процедуру нельзя. У процедур обработки некоторых других событий могут быть параметры. Например, у события MouseMove (координаты курсора мыши) или KeyUp (код отжатой клавиши). Эти параметры передаются незаметно для программиста, и их можно использовать по своему усмотрению (а можно и вовсе не использовать).
Теперь давайте приступим непосредственно к программированию. Для начала объявим переменные с типом Double (для хранения вещественных чисел):
Private Sub cmdCalculate_Click() ' объявляем переменные Dim paramA As Double Dim paramB As Double Dim paramC As Double Dim x1 As Double Dim x2 As Double Dim 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 x1 = (paramB + Sqr(D)) / (2 * paramA) x2 = (paramB - Sqr(D)) / (2 * paramA) lblD.Caption = "Дискриминант: " & D lblX1.Caption = "Корень №1: " & x1 lblX2.Caption = "Корень №2: " & x2 ElseIf D = 0 Then x1 = paramB / (2 * paramA) x2 = x1 lblD.Caption = "Дискременант: " & D lblX1.Caption = "Корень №1: " & x1 lblX2.Caption = "Корень №2 = Корню №1" ElseIf D < 0 Then lblD.Caption = "Дискриминант: " & D lblX1.Caption = "Корней нет!" lblX2.Caption = "" MsgBox "Дискриминант меньше нуля! Корней нет!", 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 сгенерирует ошибку.