- •Введение
- •Содержание
- •1. Требования к программе
- •2. Разработка интерфейса
- •3. Системные требования
- •4. Описание используемых классов, процедур, функций
- •5. Алгоритмы процедур
- •5.1. Алгоритм основной программы
- •5.2 Алгоритм анализа строки формулы
- •5.3 Алгоритм построения графика функции Алгоритм построения графика функции представлен на рис. 4.
- •Листинг программы
- •Заключение
Листинг программы
Исходный код программы:
Public Class Form1
Dim num1, a, b As Double
Dim tip As Char
Dim j, curl, cure(10), nl, lstek(10) As Integer
Dim s As String
Dim c(10, 100) As Char
Dim d(10, 100), t(1200) As Double
Class graphic
Dim Graph1 As Graphics
Dim Pen1 As New Pen(Color.Black, 1)
Dim Pen2 As New Pen(Color.Red, 2)
Dim drawbrush1 As New SolidBrush(Color.Black)
Dim drawfont1 As New Font("Arial", 8)
Public Sub graph()
'Процедура вывода графика функции
Dim ii, shagx, shagy, X0, Y0 As Single
Dim dmin, masx, masy, dmax As Double
Dim yy1, yy2, sh As Integer
'Проверка корректности интервала вычисления функции
If Form1.TextBox2.TextLength = 0 Or Form1.TextBox3.TextLength = 0 Then
MsgBox("Введите интервал изменения Х")
Return
End If
Form1.a = Form1.TextBox2.Text
Form1.b = Form1.TextBox3.Text
If Form1.a >= Form1.b Then
MsgBox("Некорректно задана область изменения Х")
Return
End If
Graph1 = Form1.PictureBox1.CreateGraphics()
Graph1.Clear(Color.LightGray)
'Создание таблицы значений функции, определение координаты положения оси Y
shagx = (Form1.b - Form1.a) / Form1.PictureBox1.Size.Width
masx = Form1.PictureBox1.Size.Width / (Form1.b - Form1.a)
X0 = -1
For ii = 1 To Form1.PictureBox1.Size.Width
If Form1.Parse() <> 1 Then
Return
End If
Form1.t(ii) = Form1.Calc(0, Form1.a + ii * shagx)
If Math.Abs(Form1.a + ii * shagx) <= 1 / Form1.PictureBox1.Size.Width Then
X0 = ii
End If
Next
'Нахождение минимального и максимального значения функции на заданном интервале
dmax = Form1.t(1)
dmin = Form1.t(1)
Y0 = Form1.PictureBox1.Size.Height
For ii = 2 To Form1.PictureBox1.Size.Width
If Form1.t(ii) > dmax Then
dmax = Form1.t(ii)
End If
If Form1.t(ii) < dmin Then
dmin = Form1.t(ii)
End If
Next
'Определение координаты оси Х относительно минимального и максимального значения функции
If dmax * dmin < 0 Then
Y0 = dmax * Form1.PictureBox1.Size.Height / (dmax - dmin)
Else
If dmax > 0 Then
Y0 = Form1.PictureBox1.Size.Height
dmin = 0
Else
Y0 = 0
dmax = 0
End If
End If
'Вывод на экран осей координат
shagy = (dmax - dmin) / Form1.PictureBox1.Size.Height
masy = Form1.PictureBox1.Size.Height / (dmax - dmin)
If X0 <> -1 Then
Graph1.DrawLine(Pen1, X0, 0, X0, Form1.PictureBox1.Size.Height)
End If
If Y0 <> -1 Then
Graph1.DrawLine(Pen1, 0, Y0, Form1.PictureBox1.Size.Width, Y0)
sh = masx
yy1 = 1
If Y0 = 0 Then
yy1 = -1 / 3
End If
For ii = 0 To Form1.PictureBox1.Size.Width Step sh
Graph1.DrawLine(Pen1, ii, Y0 - 4, ii, Y0 + 4)
Graph1.DrawString(Form1.a + ii / sh, drawfont1, drawbrush1, ii, Y0 - 15 * yy1)
Next
Graph1.DrawString(Form1.b, drawfont1, drawbrush1, Form1.PictureBox1.Size.Width - 10, Y0 - 15)
End If
'Вывод на экран максимального и минимального значения финкции
yy1 = dmax * masy
'Graph1.DrawString("0", drawfont1, drawbrush1, X0 + 3, Y0 - 15)
Graph1.DrawLine(Pen1, X0 - 4, yy1, X0 + 4, yy1)
Graph1.DrawString(dmax, drawfont1, drawbrush1, X0 + 1, Y0 - yy1)
yy1 = dmin * masy
Graph1.DrawLine(Pen1, X0 - 4, yy1, X0 + 4, yy1)
Graph1.DrawString(dmin, drawfont1, drawbrush1, X0, Y0 - yy1 - 15)
'Вывод на экран графика функции
For ii = 2 To Form1.PictureBox1.Size.Width
yy1 = Y0 - Form1.t(ii - 1) * masy
yy2 = Y0 - Form1.t(ii) * masy
Graph1.DrawLine(Pen2, ii - 1, yy1, ii, yy2)
Next
End Sub
Public Sub clear()
Form1.PictureBox1.Refresh()
End Sub
End Class
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox1.KeyPress
If e.KeyChar >= Chr(0) Then
e.KeyChar = Chr(vbEmpty)
'Else
'If e.KeyChar = "." Then
'e.KeyChar = ","
End If
'TextBox1.Text = TextBox1.Text + e.KeyChar
'End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label1.Text = ""
End Sub
Private Function Calc(ByVal level As Integer, ByVal x As Double) As Double
'Функция вычисления выражения уровня level
Dim i, k As Integer
'Подставить в выражение значение переменной Х
i = 0
Do While c(level, i) <> "#"
If c(level, i) = "x" Then
d(level, i) = x
End If
i = i + 1
Loop
'Вычислить подвыражения, заключенные в скобки
i = 0
Do While c(level, i) <> "#"
If c(level, i) = "(" Then
d(level, i) = Calc(d(level, i), x)
End If
i = i + 1
Loop
'Вычислить функции в выражении
i = 0
Do While c(level, i) <> "#"
If c(level, i) = "s" Then
d(level, i) = Math.Sin(Calc(d(level, i), x))
End If
If c(level, i) = "c" Then
d(level, i) = Math.Cos(Calc(d(level, i), x))
End If
If c(level, i) = "e" Then
d(level, i) = Math.Exp(Calc(d(level, i), x))
End If
If c(level, i) = "t" Then
d(level, i) = Math.Tan(Calc(d(level, i), x))
End If
If c(level, i) = "l" Then
d(level, i) = Math.Log(Calc(d(level, i), x))
End If
If c(level, i) = "a" Then
d(level, i) = Math.Abs(Calc(d(level, i), x))
End If
i = i + 1
Loop
'Выполнить операции возведения в степень
i = 0
Do While c(level, i) <> "#"
If c(level, i) = "^" Then
d(level, i - 1) = d(level, i - 1) ^ d(level, i + 1)
k = i
i = i - 1
Do While c(level, k - 1) <> "#"
c(level, k) = c(level, k + 2)
d(level, k) = d(level, k + 2)
k = k + 1
Loop
End If
i = i + 1
Loop
'Выполнить операции умножения и деления
i = 0
Do While c(level, i) <> "#"
If c(level, i) = "*" Or c(level, i) = "/" Then
If c(level, i) = "/" Then
d(level, i - 1) = d(level, i - 1) / d(level, i + 1)
End If
If c(level, i) = "*" Then
d(level, i - 1) = d(level, i - 1) * d(level, i + 1)
End If
k = i
i = i - 1
Do While c(level, k - 1) <> "#"
c(level, k) = c(level, k + 2)
d(level, k) = d(level, k + 2)
k = k + 1
Loop
End If
i = i + 1
Loop
'Выполнить операции сложения и вычитания
i = 0
Do While c(level, i) <> "#"
If c(level, i) = "+" Or c(level, i) = "-" Then
If c(level, i) = "-" Then
d(level, i - 1) = d(level, i - 1) - d(level, i + 1)
End If
If c(level, i) = "+" Then
d(level, i - 1) = d(level, i - 1) + d(level, i + 1)
End If
k = i
i = i - 1
Do While c(level, k - 1) <> "#"
c(level, k) = c(level, k + 2)
d(level, k) = d(level, k + 2)
k = k + 1
Loop
End If
i = i + 1
Loop
Return d(level, 0)
End Function
Private Function Parse() As Integer
'Функция анализа введенной текстовой строки
Dim i, point As Integer
If TextBox1.TextLength = 0 Then
Return 0
End If
s = TextBox1.Text
curl = 0 'текущий уровень
cure(curl) = -1 'номер текущего элемента на уровне curl
nl = 1 'количество заполненых уровней
tip = "0" 'текущий тип (цифра, знак)
For i = 0 To TextBox1.TextLength - 1
'Если встретилась цифра
If s(i) >= "0" And s(i) <= "9" Then
If tip <> "n" Then
tip = "n"
cure(curl) = cure(curl) + 1
c(curl, cure(curl)) = "n"
d(curl, cure(curl)) = 0
j = 0
point = 0
End If
If point = 0 Then 'увеличение целой части числа
d(curl, cure(curl)) = d(curl, cure(curl)) * 10 + Asc(s(i)) - 48
Else 'увеличение дробной части числа
d(curl, cure(curl)) = d(curl, cure(curl)) + (Asc(s(i)) - 48) * (0.1 ^ j)
j = j + 1
End If
End If
If s(i) = "." Then 'далее будет вводится дробная часть числа
point = 1
j = 1
End If
'Арифметическая операция
If s(i) = "*" Or s(i) = "/" Or s(i) = "+" Or s(i) = "-" Or s(i) = "^" Then
If tip = "0" And s(i) = "-" Then
cure(curl) = cure(curl) + 1
c(curl, cure(curl)) = "n"
d(curl, cure(curl)) = 0
End If
tip = "o"
cure(curl) = cure(curl) + 1
c(curl, cure(curl)) = s(i)
d(curl, cure(curl)) = -1
End If
'Если встретилась открывающая скобка
If s(i) = "(" Then
cure(curl) = cure(curl) + 1
c(curl, cure(curl)) = "("
d(curl, cure(curl)) = nl 'ссылка на новый уровень
lstek(nl) = curl 'запоминается текущий уровень
curl = nl 'перейти на следующий уровень
cure(curl) = -1
nl = nl + 1 'увеличить количество уровней
tip = "0"
End If
If s(i) = ")" Then
tip = ")"
c(curl, cure(curl) + 1) = "#"
curl = lstek(curl) 'возврат на старый уровень
End If
'Если встрилась переменная
If s(i) = "x" Then
If tip = "n" Then 'добавить операцию умножения, если перед Х стоит число
cure(curl) = cure(curl) + 1
c(curl, cure(curl)) = "*"
d(curl, cure(curl)) = -1
End If
tip = "x"
cure(curl) = cure(curl) + 1
c(curl, cure(curl)) = "x"
d(curl, cure(curl)) = -1
End If
'Если встретилась функция
If s(i) = "s" Or s(i) = "c" Or s(i) = "e" Or s(i) = "l" Or s(i) = "t" Or s(i) = "a" Then
If tip = "n" Then
cure(curl) = cure(curl) + 1
c(curl, cure(curl)) = "*"
d(curl, cure(curl)) = -1
End If
cure(curl) = cure(curl) + 1
c(curl, cure(curl)) = s(i)
d(curl, cure(curl)) = nl 'ссылка на новый уровень
lstek(nl) = curl 'запоминается текущий уровень
curl = nl 'перейти на следующий уровень для ввода выражения стоящего в функции
cure(curl) = -1
nl = nl + 1 'увеличить количество уровней
tip = "0"
i = i + 3
End If
Next
c(curl, cure(curl) + 1) = "#"
Return 1
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim res As Double
Dim gr As New graphic
Try
If Parse() = 1 Then
res = Calc(0, TextBox2.Text)
Label1.Text = res
End If
gr.graph()
Catch ex As Exception
MsgBox("Арифметическая ошибка, возможно вы ввели некорректное выражение, в котором содержится:" + Chr(13) + Chr(13) + Chr(9) + "Деление на ноль" + Chr(13) + Chr(9) + "Логарифм нуля" + Chr(13) + Chr(9) + "Тангенс п/2")
'MsgBox("Ошибка" + ex.ToString())
End Try
End Sub
Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
Dim gr As New graphic
gr.graph()
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
TextBox1.Paste("1")
Label4.Text = Label4.Text + "1"
End Sub
Private Sub Button9_Click(sender As System.Object, e As System.EventArgs) Handles Button9.Click
TextBox1.Paste("8")
Label4.Text = Label4.Text + "8"
End Sub
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
TextBox1.Paste("2")
Label4.Text = Label4.Text + "2"
End Sub
Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
TextBox1.Paste("3")
Label4.Text = Label4.Text + "3"
End Sub
Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
TextBox1.Paste("4")
Label4.Text = Label4.Text + "4"
End Sub
Private Sub Button6_Click(sender As System.Object, e As System.EventArgs) Handles Button6.Click
TextBox1.Paste("5")
Label4.Text = Label4.Text + "5"
End Sub
Private Sub Button7_Click(sender As System.Object, e As System.EventArgs) Handles Button7.Click
TextBox1.Paste("6")
Label4.Text = Label4.Text + "6"
End Sub
Private Sub Button8_Click(sender As System.Object, e As System.EventArgs) Handles Button8.Click
TextBox1.Paste("7")
Label4.Text = Label4.Text + "7"
End Sub
Private Sub Button10_Click(sender As System.Object, e As System.EventArgs) Handles Button10.Click
TextBox1.Paste("9")
Label4.Text = Label4.Text + "9"
End Sub
Private Sub Button11_Click(sender As System.Object, e As System.EventArgs) Handles Button11.Click
TextBox1.Paste("0")
Label4.Text = Label4.Text + "0"
End Sub
Private Sub Button20_Click(sender As System.Object, e As System.EventArgs) Handles Button20.Click
TextBox1.Paste("sin(")
Label4.Text = Label4.Text + "sin("
End Sub
Private Sub Button21_Click(sender As System.Object, e As System.EventArgs) Handles Button21.Click
TextBox1.Paste("cos(")
Label4.Text = Label4.Text + "cos("
End Sub
Private Sub Button22_Click(sender As System.Object, e As System.EventArgs) Handles Button22.Click
TextBox1.Paste("tan(")
Label4.Text = Label4.Text + "tan("
End Sub
Private Sub Button23_Click(sender As System.Object, e As System.EventArgs) Handles Button23.Click
TextBox1.Paste("exp(")
Label4.Text = Label4.Text + "exp("
End Sub
Private Sub Button24_Click(sender As System.Object, e As System.EventArgs) Handles Button24.Click
TextBox1.Paste("log(")
Label4.Text = Label4.Text + "log("
End Sub
Private Sub Button25_Click(sender As System.Object, e As System.EventArgs) Handles Button25.Click
TextBox1.Paste("abs(")
Label4.Text = Label4.Text + "abs("
End Sub
Private Sub Button26_Click(sender As System.Object, e As System.EventArgs) Handles Button26.Click
TextBox1.Paste("x")
Label4.Text = Label4.Text + "x"
End Sub
Private Sub Button12_Click(sender As System.Object, e As System.EventArgs) Handles Button12.Click
TextBox1.Paste(",")
Label4.Text = Label4.Text + ","
End Sub
Private Sub Button13_Click(sender As System.Object, e As System.EventArgs) Handles Button13.Click
TextBox1.Paste("(")
Label4.Text = Label4.Text + "("
End Sub
Private Sub Button14_Click(sender As System.Object, e As System.EventArgs) Handles Button14.Click
TextBox1.Paste(")")
Label4.Text = Label4.Text + ")"
End Sub
Private Sub Button15_Click(sender As System.Object, e As System.EventArgs) Handles Button15.Click
TextBox1.Paste("+")
Label4.Text = Label4.Text + "+"
End Sub
Private Sub Button16_Click(sender As System.Object, e As System.EventArgs) Handles Button16.Click
TextBox1.Paste("-")
Label4.Text = Label4.Text + "-"
End Sub
Private Sub Button17_Click(sender As System.Object, e As System.EventArgs) Handles Button17.Click
TextBox1.Paste("*")
Label4.Text = Label4.Text + "*"
End Sub
Private Sub Button18_Click(sender As System.Object, e As System.EventArgs) Handles Button18.Click
TextBox1.Paste("/")
Label4.Text = Label4.Text + "/"
End Sub
Private Sub Button19_Click(sender As System.Object, e As System.EventArgs) Handles Button19.Click
TextBox1.Paste("^")
Label4.Text = Label4.Text + "^"
End Sub
Private Sub Button28_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button28.Click
Dim gr As New graphic
TextBox1.Clear()
Label4.Text = ""
Label1.Text = ""
gr.clear()
Label5.Text = ""
End Sub
End Class