Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Калк пояснительная записка14.doc
Скачиваний:
1
Добавлен:
13.09.2019
Размер:
194.05 Кб
Скачать

Листинг программы

Исходный код программы:

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