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

ПРИЛОЖЕНИЕ 1

Схема алгоритма

ПРИЛОЖЕНИЕ 2

Текст программы

Модуль листа «Конструкция»:

'Возникает при нажатии кнопки расчёт с помощью VBA на листе1

Private Sub CommandButton1_Click()

'Показ окна расчета с помощью VBA

UserForm1.Show

End Sub

Модуль книги Excel «ЭтаКнига»:

‘Данная процедура выполняется при открытии книги курсовой работы’

Private Sub Workbook_Open()

'Вывод на экран заставки (пользовательской формы)'

UserForm2.Show

'Заполнение списка на странице График'

End Sub

Модуль пользовательской формы «Form2»:

'Процедура вызывается при открытии пользовательской формы на экран'

Private Sub UserForm_Activate()

Application.OnTime Now + TimeValue("00:00:05"), "killtheform"

End Sub

'Процедура инициализации пользоваетльской формы'

Private Sub UserForm_Initialize()

With txtlogo

.MultiLine = True

.Font.Size = 12

.Font.Bold = True

.Locked = True

.Text = "БрГТУ гр. Т-77" + vbCr + "Copyright " + Chr(169) + " Андрияшко А.С." + vbCr + "All Right Reserved"

End With

End Sub

Модуль программы «Module1»:

'Макрос закрытия заставки(пользовательской формы), вызывается через пять секунд после' 'вывода ее на экран, после закрытия на экран выводится рабочая форма'

Private Sub killtheform()

'закрытие пользовательской формы'

Unload UserForm2

'Вывод рабочей формы на экран'

UserForm1.Show

End Sub

Модуль программы «Module3»:

Sub Command_button2()

Worksheets("конструкция").Unprotect

Worksheets("конструкция").Activate

k = 1 ' номер варианта

'Ввод исходных данных

F = Val(InputBox("Введите F", "", "10"))

Cells(21, 1) = F + 0.1 * k

G1 = Val(InputBox("Введите G1", "Ввод исходных данных", "10"))

Cells(21, 2) = G1 + 0.1 * k

G2 = Val(InputBox("Введите G2", "Ввод исходных данных", "10"))

Cells(21, 3) = G2 + 0.1 * k

sina1 = Val(InputBox("Введите sin a1", "Ввод исходных данных", "0.2"))

Cells(21, 4) = sina1 + 0.001 * k

sina2 = Val(InputBox("Введите sin a2", "Ввод исходных данных", "0.13"))

Cells(21, 5) = sina2 - 0.001 * k

sina3 = Val(InputBox("Введите sin a3", "Ввод исходных данных", "0.68"))

Cells(21, 6) = sina3 - 0.001 * k

sina4 = Val(InputBox("Введите sin a4", "Ввод исходных данных", "0.88"))

Cells(21, 7) = sina4 - 0.001 * k

a = Val(InputBox("Введите a", "Ввод исходных данных", "1"))

Cells(21, 8) = a

b = Val(InputBox("Введите b", "Ввод исходных данных", "1"))

Cells(21, 9) = b

Worksheets("конструкция").Protect

End Sub

Модуль основной пользовательской формы «Form1»:

'Объявление переменных

Dim N As Integer

Dim G1, G2, F, Nd, Nc, S1, S2 As Single

Dim sina1, sina2, sina3, sina4, a, b As Single

Dim str_znach As String

'Задание матрицы в виде двумерного массива

Dim MATR(7, 7) As Double

'Задание вектора свободных членов в виде одномерного массива

Dim S_CH(7) As Double

'Одномерный массив, содержащий решение СЛАУ

Dim resh(7) As Double

' Процедура вызывается при активации рабочей формы'

Private Sub UserForm_Activate()

N = 1 'первая цифра варианта

Worksheets("конструкция").Unprotect ' снятие защиты с листа Конструкция'

Worksheets("конструкция").Activate ' сделать активной лист конструкция'

' считывание данных в текстовое поле Ft вкладки "исходные данные" из листа "Конструкция"

tf.Text = Format(Cells(21, 1), "#0.#0")

F = Format(Cells(21, 1), "#0.#0")

' считывание данных в текстовое поле G1 вкладки "исходные данные" из листа "Конструкция"

tg1.Text = Format(Cells(21, 2), "#0.#0")

G1 = Format(Cells(21, 2), "#0.#0")

' считывание данных в текстовое поле G2 вкладки "исходные данные" из листа "Конструкция"

tg2.Text = Format(Cells(21, 3), "#0.#0")

G2 = Format(Cells(21, 3), "#0.#0")

' считывание данных в текстовое поле sina1 вкладки "исходные данные" из листа "Конструкция"

tsina1.Text = Format(Cells(21, 4), "0.##0")

sina1 = Format(Cells(21, 4), "0.##0")

' считывание данных в текстовое поле sina2 вкладки "исходные данные" из листа "Конструкция"

tsina2.Text = Format(Cells(21, 5), "0.##0")

sina2 = Format(Cells(21, 5), "0.##0")

' считывание данных в текстовое поле sina3 вкладки "исходные данные" из листа "Конструкция"

tsina3.Text = Format(Cells(21, 6), "0.##0")

sina3 = Format(Cells(21, 6), "0.##0")

' считывание данных в текстовое поле sina4 вкладки "исходные данные" из листа "Конструкция"

tsina4.Text = Format(Cells(21, 7), "0.##0")

sina4 = Format(Cells(21, 7), "0.##0")

' считывание данных в текстовое поле a вкладки "исходные данные" из листа "Конструкция"

ta.Text = Format(Cells(21, 8), "#0.0")

a = Format(Cells(21, 8), "#0.0")

' считывание данных в текстовое поле b вкладки "исходные данные" из листа "Конструкция"

tb.Text = Format(Cells(21, 9), "#0.0")

b = Format(Cells(21, 9), "#0.0")

Worksheets("графика").Activate

' считывание данных в текстовые поля вкладки "Графика" из листа "Графика"

TextBox1.Text = Format(Cells(3, 8), "#0.#0")

TextBox2.Text = Format(Cells(4, 8), "#0.#0")

TextBox3.Text = Format(Cells(3, 9), "#0.#0")

TextBox4.Text = Format(Cells(4, 9), "#0.#0")

' сделать активным лист конструкция'

Worksheets("конструкция").Activate

' защита листа Конструкция

Worksheets("конструкция").Protect

End Sub

' кнопка "Показать"(Exel)

Private Sub CommandButton1_Click()

Worksheets("Решение").Activate

'Cчитывание значение Xo из рабочего листа "рассчёт реакций"

TextCelXo = Format(Cells(12, 1), "#0.###0")

'Cчитывание значение Yo из рабочего листа "рассчёт реакций"

TextcelYo = Format(Cells(12, 2), "#0.###0")

'Cчитывание значение Nd из рабочего листа "рассчёт реакций"

TextcelNd = Format(Cells(12, 3), "#0.###0")

'Cчитывание значение Nc из рабочего листа "рассчёт реакций"

TextcelNc = Format(Cells(12, 4), "#0.###0")

'Cчитывание значение S1 из рабочего листа "рассчёт реакций"

TextcelS1 = Format(Cells(12, 5), "#0.###0")

'Cчитывание значение S2 из рабочего листа "рассчёт реакций"

TextcelS2 = Format(Cells(12, 6), "#0.###0")

End Sub

'кнопка расчитать(VBA)

Private Sub CommandButton2_Click()

'объявление переменных

Dim z, z2 As Integer

'сделать рабочим лист "Решение"

Worksheets("Решение").Activate

For z = 4 To 9 Step 1

S_CH(z - 3) = Cells(z, 9) 'Заполняем матрицу свободных членов'

For z2 = 1 To 6 Step 1

MATR(z - 3, z2) = Cells(z, z2) 'Заполняем матрицу коэфициентов'

Next z2

Next z

' элементам массива Х(i) присваиваем значение 0

For z = 1 To 6

resh(z) = 0

Next z

'вызов функции для решения СЛАУ

Call gaussmethod(6, MATR(), S_CH, resh())

'Вывод значений эмлементов массива resh на вкладку "Расчёт реакций"

TextCelXo1 = resh(1)

TextcelYo1 = resh(2)

TextcelNd1 = resh(3)

TextcelNc1 = resh(4)

TextcelS11 = resh(5)

TextcelS21 = resh(6)

End Sub

' метод Гауса

' сначала делает из искомой матрицы нижнюю треугольную. Это называется прямым ходом

' затем методом выражения находит решение СЛАУ. Это называется обратным ходом.

' также прооверяет нет ли на главной диагонали нулевых элементов.

Sub gaussmethod(N As Integer, M() As Double, b() As Double, X() As Double)

' M - искомая матрица

' B - матрица свободных членов

' X - матрица полученных решений систему уравнений

' N - размерность матрицы

'объявление переменных

Dim i, a, l As Integer

Dim q, p, t As Double

'прямой ход

For l = 1 To (N - 1)

' проверка не является ли элемент главной диагонали равен нулю

If M(l, l) = 0 Then

p = 0

For i = 2 To N Step 1

'Перестановка строк местами

If Abs(M(i, l)) <> 0 Then

p = i

If (l <> p) Then

For a = 1 To (N + 1) Step 1

t = M(l, a)

M(l, a) = M(p, a)

M(p, a) = t

Next a

t = b(l)

b(l) = b(p)

b(p) = t

End If

Exit For

End If

Next i

End If

'прямой ход

q = M(l, l)

' делим lю строку на коэфициент q

For i = l To N Step 1

M(l, i) = M(l, i) / q

Next i

b(l) = b(l) / q

For a = (l + 1) To N Step 1

q = M(a, l)

For i = 1 To N Step 1

M(a, i) = M(a, i) - M(l, i) * q

Next i

b(a) = b(a) - b(l) * q

Next a

Next l

'обратный ход

For i = N To 1 Step -1

q = 0 ' промежуточная сумма

For a = 0 To (N - i)

q = q + M(i, N - a) * X(N - a)

Next a

b(i) = b(i) - q

X(i) = b(i) / M(i, i) ' нахождение корней СЛАУ

Next i

End Sub

' кнопка "расчитать" вкладки "Контроль Решения"

Private Sub CommandButton3_Click()

'объявление переменных

Dim delta, max As Double

Dim i As Byte

'вызов нажатия кнопки "Рассчитать(VBA)"

Call CommandButton2_Click

'нахождение максимального элемента из массива Resh

max = Abs(resh(1))

For i = 1 To 6 Step 1

If Abs(resh(i)) > Abs(max) Then max = Abs(resh(i))

Next i

S2 = Val(TextcelS11)

S1 = Val(TextcelS21)

'считывение в текстовое поле формы невязку, полученную с помощью рассчётов в Exсel

tpogrexcel.Text = Format(Worksheets("решение").Range("F21").Value, "percent")

' расчёт невязки

delta = Abs(a * F - a * G1 + a * S1 * Sqr(1 - sina3 ^ 2) + a * S2 * (Sqr(1 - sina4 ^ 2) - 2 * sina4))

tpogrvba.Text = Format(delta / max * 100, "percent")

If Val(tpogrexcel.Text) <= 0.03 And Val(tpogrvba.Text) <= 0.03 Then

'если точность удовлетворяет заданным условиям

lblvivod.Caption = "Малость величины относительной невязки показывает, что полученные значения реакций могут быть взяты в качестве решения системы"

Else

' если точность слишком мала

lblvivod.Caption = "Точность решения неудовлетворительная!"

'вывод Message Box

MsgBox "Проверьте исходные данные и расчеты!", vbCritical, "Предупреждение"

End If

End Sub

'Обработчик кнопки "построить график" вкладки "Графика"

Private Sub cmd_gr_Click()

'сделать лист "Графика" рабочим

Worksheets("Графика").Activate

' проверка введённых данных

If (Val(TextBox1.Text) <> Val(TextBox2.Text)) Then

If (Val(TextBox3.Text) <> Val(TextBox4.Text)) Then

'считывание значений в ячейки EXCEL

Cells(3, 8) = TextBox1.Text

Cells(4, 8) = TextBox2.Text

Cells(3, 9) = TextBox3.Text

Cells(4, 9) = TextBox4.Text

Else: MsgBox "исходные данные неверны!", vbCritical, "Ошибка ввода данных"

End If

Else: MsgBox "исходные данные неверны!", vbCritical, "Ошибка ввода данных"

End If

Set currentchart = Sheets("Графика").ChartObjects(2).Chart

fname = "temp.gif"

currentchart.Export Filename:=fname, filtername:="gif"

Image4.Picture = LoadPicture(fname)

End Sub

'обработчики двойного клика по текстовым полям вкладки "Исходные данные"

Private Sub tg1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

' снятие защиты от записи листа Конструкция'

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите G1", "Ввод исходных данных", "10.0")

'проверка введённого значения

If str_znach <> "" Then

G1 = Val(str_znach)

' сделать активным лист "конструкция"'

Worksheets("конструкция").Activate

Cells(21, 2) = G1 + 0.1 * N

tg1.Text = Format(Cells(21, 2), "0#.#0")

' поставить защиту от записи на лист "Конструкция"'

Worksheets("конструкция").Protect

End If

End Sub

Private Sub tg2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите G2", "Ввод исходных данных", "10.0")

If str_znach <> "" Then

G2 = Val(str_znach)

Worksheets("конструкция").Activate

Cells(21, 3) = G2 + 0.1 * N

tg2.Text = Format(Cells(21, 3), "0#.#0")

Worksheets("конструкция").Protect

End If

End Sub

Private Sub tf_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите F", "Ввод исходных данных", "10.0")

If str_znach <> "" Then

F = Val(str_znach)

Worksheets("конструкция").Activate

Cells(21, 1) = F + 0.1 * N

tf.Text = Format(Cells(21, 1), "0#.#0")

Worksheets("конструкция").Protect

End If

End Sub

Private Sub tb_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите b", "Ввод исходных данных", "1")

If str_znach <> "" Then

b = Val(str_znach)

Worksheets("конструкция").Activate

Cells(21, 9) = b

tb.Text = Format(Cells(21, 9), "#.0")

Worksheets("конструкция").Protect

End If

End Sub

Private Sub tsina4_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите sina4", "Ввод исходных данных", "0.88")

If str_znach <> "" Then

sina4 = Val(str_znach)

Worksheets("конструкция").Activate

Cells(21, 7) = sina4 - 0.001 * N

tsina4.Text = Format(Cells(21, 7), "0.##0")

Worksheets("конструкция").Protect

End If

End Sub

Private Sub tsina1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите sina1", "Ввод исходных данных", "0.2")

If str_znach <> "" Then

sina1 = Val(str_znach)

Worksheets("конструкция").Activate

Cells(21, 4) = sina1 + 0.001 * N

tsina1.Text = Format(Cells(21, 4), "0.##0")

Worksheets("конструкция").Protect

End If

End Sub

Private Sub tsina2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите sina2", "Ввод исходных данных", "0.13")

If str_znach <> "" Then

sina2 = Val(str_znach)

Worksheets("конструкция").Activate

Cells(21, 5) = sina2 - 0.001 * N

tsina2.Text = Format(Cells(21, 5), "0.##0")

Worksheets("конструкция").Protect

End If

End Sub

Private Sub tsina3_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите sina3", "Ввод исходных данных", "0.68")

If str_znach <> "" Then

sina3 = Val(str_znach)

Worksheets("конструкция").Activate

Cells(21, 6) = sina3 - 0.001 * N

tsina3.Text = Format(Cells(21, 6), "0.##0")

Worksheets("конструкция").Protect

End If

End Sub

Private Sub ta_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Worksheets("конструкция").Unprotect

str_znach = InputBox("Введите a", "Ввод исходных данных", "1")

If str_znach <> "" Then

a = Val(str_znach)

Worksheets("конструкция").Activate

Cells(21, 8) = a

ta.Text = Format(Cells(21, 8), "#.0")

Worksheets("конструкция").Protect

End If

End Sub

Соседние файлы в папке Курсач вариант 1