- Осуществление с помощью Timer движения автобусов путем расчета новых координат промежуточного положения автобусов, учитывая изменения по координатным осям, и перерисовкой автобусов на новом месте
- При выборе автобуса – щелчок по нему – отображение основных данных по нему: имена водителя и кондуктора, номер, скорость с учетом времени суток и уровень оставшегося топлива
- При щелчке по остановкам перемещать активный в данный момент автобус( выделенный) на эти остановки
- При выборе пунктов меню: переместить на остановку вперед и назад - перемещать активный в данный момент автобус( выделенный) соответственно на эти остановки
- При выборе пунктов: Режимы передвижения или просмотра автобусов – соответственно разрешать или запрещать ручное (Drag_and_Drop) перетаскивание автобусов
2.Просмотр свободных автобусов
- открывает файл свободных автобусов
3.Редактор маршрутов
- Считывание из файла " Маршруты.txt" названия всех существующих маршрутов и запись их в Combo_Box
- При выборе определенного маршрута из списка представленных - считывание из файла выбранного маршрута " < Имя маршрута >.txt" данных : номера автобусов, имена их водителей и кондукторов, названия всех остановок и их координаты. Отображение в Picture_Box схемы самого маршрута с помощью линий и остановки – Image_Box
- При нажатии кнопки Новый считывание из файла " Маршруты.txt" названия всех существующих маршрутов и запись их в Combo_Box
- При выборе кнопок Добавление/Изменение или Удаление соответственно добавление, изменение или удаление в зависимости от определенных параметров
- При нажатии соответствующих после выбора режима изменения маршрутов кнопок переименование, удаление, перемещение выбранной остановки или добавление новой
- Перенаправление маршрута и запоминание соответственно уже измененного маршрута
- При нажатие соответствующей кнопки запись изменений в файл открытого маршрута
4.Создание нового маршрута
- Запись в файл маршрутов названия нового и создание файла самого маршрута
4. Программная часть
Самыми сложными на мой взгляд и наиболее требующими внимания являются следующие части кода программы:
1.Визуализация движения автобусов
Fori = 0 To (AllBuses - 1)
Fuel(i) = Fuel(i) - 1 / (10000 * Me.Timer1.Interval)
If i = Misk Then Me.Label13.Caption = Str$(Fuel(Misk))
If Fuel(i) = 0 Then Fuel(i) = 100
Next i
For z = 0 To (Combo1.ListCount - 1)
For i = 0 To (arBusCount(z) - 1)
If z <> 0 Then
a = i
For j = 0 To (z - 1)
i = i + arBusCount(j)
Next j
End If
If arStayPast(z, i) = (arStayCount(z) - 1) Then arStayEdit(z, i)= -1
If arStayPast(z, i) = 0 Then arStayEdit(z, i) = 1
If Val(arStayAbsciss(z, arStayPast(z, i))) > Val(arStayAbsciss(z, arStayPast(z, i) + arStayEdit(z, i))) _
Then arCoordEdit(z, i) = -1
If Val(arStayAbsciss(z, arStayPast(z, i))) < Val(arStayAbsciss(z, arStayPast(z, i) + arStayEdit(z, i))) _
Then arCoordEdit(z, i) = 1
If Val(arStayAbsciss(z, arStayPast(z, i))) = Val(arStayAbsciss(z, arStayPast(z, i) + arStayEdit(z, i))) _
Then arCoordEdit(z, i) = 0
k(z, i) = (Val(arStayOrdinata(z, arStayPast(z, i))) - Val(arStayOrdinata(z, arStayPast(z, i) + arStayEdit(z, i)))) / _
(Val(arStayAbsciss(z, arStayPast(z, i))) - Val(arStayAbsciss(z, arStayPast(z, i) + arStayEdit(z, i))))
b(z, i) = Val(arStayOrdinata(z, arStayPast(z, i))) - k(z, i) * Val(arStayAbsciss(z, arStayPast(z, i)))
Dim c As Single
c = Cos(Atn(k(z, i)))
x0(z, i) = x0(z, i) + c * 2 * arCoordEdit(z, i)
y0(z, i) = k(z, i) * x0(z, i) + b(z, i)
Image1(i).Move x0(z, i) - Image1(i).Width / 2, y0(z, i) - Me.Image1(i).Height / 2
If arCoordEdit(z, i) = 1 Then
If x0(z, i) >= Val(arStayAbsciss(z, arStayPast(z, i) + arStayEdit(z, i))) _
Then arStayPast(z, i) = arStayPast(z, i) + arStayEdit(z, i)
End If
If arCoordEdit(z, i) = -1 Then
If x0(z, i) <= Val(arStayAbsciss(z, arStayPast(z, i) + arStayEdit(z, i)))_
Then arStayPast(z, i) = arStayPast(z, i) + arStayEdit(z, i)
End If
If z <> 0 Then i = a
Next i
Next z
End Sub
где k(z, i) – угловой коэффициент уравнения движения автобуса " i " по маршруту " z "; b(z, i) – свободный член того же уравнения; arCoordEdit(z, i) – в какую сторону изменять координату автобуса; arStayPast(z, i), arStayEdit(z, i) – соответственно последняя остановка, которую прошел автобус, и величина, показывающая в какую сторону будут изменяться остановки; с – изменение координаты автобуса по X; x0(z, i), y0(z, i) – промежуточные координаты автобуса. В данной процедуре программа сама проверяет в какую сторону должен двигаться определенный автобус, как должна изменяться его координата и где следующий момент времени он будет находиться.
2.Работа с текстовыми файлами при считывании информации об определенном маршруте
Public Static Sub Work_With_Files()
arBusCount(Mis) = 0
arStayCount(Mis) = 0
Open "c:\Курсоваямоя\" + Combo1.List(Mis) + ".txt" For Input As 2
Do While Not EOF(2)
Input #2, a$
Select Case a$
Case "автобус": Input #2, arBusNumber(Mis, arBusCount(Mis))
Case "водитель": Input #2, arDriveName(Mis, arBusCount(Mis))
Case "кондуктор": Input #2, arConductorName(Mis, arBusCount(Mis))
arBusCount(Mis) = arBusCount(Mis) + 1
Case "остановка": Input #2, arStayName(Mis, arStayCount(Mis))
Input #2, arStayAbsciss(Mis, arStayCount(Mis))
Input #2, arStayOrdinata(Mis, arStayCount(Mis))
arStayCount(Mis) = arStayCount(Mis) + 1
End Select
Loop
Close 2
End Sub
где Mis – номер текущего маршрута, файл которого читается.
Полный код программы смотрите в Приложении.
Вывод
В данной программе удалось полностью реализовать поставленную задачу.
С помощью VisualBasic получили:
Программу - модель работы оператора по управлению автобусами
Обеспечили возможность управления движением автобусов по каждому из предложенных, созданных или уже существующих маршрутов.
Предоставили возможность изменения данных по маршруту: непосредственно имени самого маршрута, возможность добавить или удалить автобус, а также изменить данные по автобусам: имена водителя и кондуктора; удалить, добавить, переместить, переименовать остановки или вообще изменить направление движения по маршруту, поменять порядок прохождения остановок автобусами данного маршрута, плюс удаление самого маршрута при необходимости.
Обеспечили возможности создания своего маршрута, а также корректировки данных (бортовой номер) по свободным автобусам (которые могут быть задействованы, если это необходимо).
Плюс ко всему, смоделировали (визуализировать) наглядное движение автобусов с учетом зависимости скорости автобусов от времени суток.
Список использованной литературы
1.VisualBasic 6.0 – Мастер – Разработка приложений. Санкт – Петербург, " БХВ - Петербург", 2000
2.Самоучитель по VisualBasic 6.0
Приложение
Form1
Public EditBus As Boolean
Public EditLine As Boolean
Dim DooM As Boolean, Doomy As Boolean, Do_Do As Boolean
Dim Mis As Integer, Mi As Integer
Dim Misk As Integer, disk As Integer
Dim w As Single
Dim arLinesName(0 To 30) As String, LinesCount As Integer '30 - max маршрутов
Dim arBusNumber(0 To 30, 0 To 25) As String, arBusCount(0 To 30) As Integer
Dim AllBuses As Integer '25 - max автобусов
Dim arDriveName(0 To 30, 0 To 25) As String
Dim arConductorName(0 To 30, 0 To 25) As String
Dim arStayName(0 To 30, 0 To 35) As String ' 35 max остановокнаодноммаршруте
Dim arStayAbsciss(0 To 30, 0 To 35) As String
Dim arStayOrdinata(0 To 30, 0 To 35) As String
Dim arStayCount(0 To 30) As Integer
Dim arName(0 To 30, 0 To 35) As String ' 35 - max остановокнаодноммаршруте
Dim arAbsciss(0 To 30, 0 To 35) As String
Dim arOrdinata(0 To 30, 0 To 35) As String
Dim arFreeBuses(0 To 100) As String
Dim q As Integer, food As Boolean, Boom As Boolean
Dim e As Integer, mx As Single, my As Single
Dim zzz As Integer, zxz As Integer
Dim aa As Integer, x0 As Single, y0 As Single, nama(0 To 30, 0 To 35) As String
Private Sub Combo1_Click()
Mi = 0
Misk = 0
Boom = True
disk = 999
Do_Do = False
Doomy = False
Command4.Enabled = False
Command5.Enabled = False
Command6.Enabled = False
Combo2.Clear
Combo3.Clear
Combo4.Clear
Text1.Text = "": Text2.Text = "": Text3.Text = "": Text4.Text = ""
Me.Picture1.Visible = True
Combo2.Enabled = True: Combo4.Enabled = True
Command1.Enabled = True: Command2.Enabled = True: Command3.Enabled = True: Command7.Enabled = True
Command5.Enabled = True
Mis = Combo1.ListIndex
If Len(Dir("c:\Курсоваямоя\" + Combo1.List(Mis) + ".txt")) = 0 Then
MsgBox"Файл маршрута не найден" + vbCrLf + _
"Проверьте его наличие: 'c:\Курсовая моя\" + Combo1.List(Mis) + ".txt'"
Exit Sub
Else
Files
End If
For i = 0 To arBusCount(Mis) - 1
Combo2.AddItem arBusNumber(Mis, i)
Next i
For i = 0 To 35
Image1(i).Picture = LoadPicture("c:\Курсоваямоя\Иконки\Icon2.ico")
Next i
Picture1.Cls
For i = 1 To 35
Me.Image1(i).Visible = False
Me.Label14(i).Visible = False
Next i
Me.Picture1.PSet (arStayAbsciss(Mis, 0), arStayOrdinata(Mis, 0))
w = Me.Image1(0).Width / 2
Me.Image1(0).Move arStayAbsciss(Mis, 0) - w, arStayOrdinata(Mis, 0) - w
Me.Label14(0).Move Image1(0).Left + 2 * w, Image1(0).Top
Me.Label14(0).Caption = arStayName(Mis, 0)
For i = 0 To (arStayCount(Mis) - 1)
Me.Picture1.Line -(arStayAbsciss(Mis, i), arStayOrdinata(Mis, i))
Me.Image1(i).Move arStayAbsciss(Mis, i) - w, arStayOrdinata(Mis, i) - w
Me.Image1(i).Visible = True
Me.Label14(i).Visible = True
Me.Label14(i).Move Image1(i).Left + 2 * w, Image1(i).Top
Me.Label14(i).Caption = arStayName(Mis, i)
Me.Combo4.AddItem arStayName(Mis, i)
Next i
End Sub
Private Sub Combo2_Click()
DooM = False
Text2.Enabled = True: Text3.Enabled = True
Me.Command8.Enabled = True
Misk = Combo2.ListIndex
Text1.Text = arBusNumber(Mis, Misk)
Text2.Text = arDriveName(Mis, Misk)
Text3.Text = arConductorName(Mis, Misk)
End Sub
Private Sub Combo3_Click()
DooM = True
Text2.Enabled = True: Text3.Enabled = True
Mi = Combo3.ListIndex
Text1.Text = Combo3.List(Mi)
Text2.Text = ""
Text3.Text = ""
End Sub
Private Sub Combo4_Click()
disk = Combo4.ListIndex
Text4.Enabled = True
Text4.Text = Combo4.List(disk)
For i = 0 To 35
If Label14(i).Caption = Combo4.List(disk) Then
Image1(i).Picture = LoadPicture("c:\Курсоваямоя\Иконки\!conMania.cur")
Else
Image1(i).Picture = LoadPicture("c:\ Курсоваямоя\Иконки\Icon2.ico")
End If
Next i
End Sub
Private Sub Combo5_Click()
zxz = Combo5.ListIndex
Text7.Text = Combo5.List(zxz)
Text6.Text = ""
Text5.Text = ""
Command11.Enabled = True
Text5.Enabled = True
Text6.Enabled = True
End Sub
Private Sub Combo7_Click()
Text9.Enabled = True
Text9.Text = nama(LinesCount - 1, Combo7.ListIndex)
End Sub
Private Sub Command1_Click()
IfLen(Dir("c:\Курсовая моя\Свободные автобусы.txt")) = 0 Then
MsgBox "Файл свободных автобусов не найден!!!" + vbCrLf + _
"Проверьте его наличие : 'c:\ Курсовая моя\Свободные автобусы.txt'"
Exit Sub
End If
Combo3.Enabled = True
i = 0
Open "c:\ Курсовая моя\Свободные автобусы.txt" ForInputAs 3
Do While Not EOF(3)
Input #3, arFreeBuses(i)
Combo3.AddItem arFreeBuses(i)
i = i + 1
Loop
Close 3
End Sub
Private Sub Command10_Click()
IfCommand10.Caption = "Начать последовательность остановок" Then
Command7.Enabled = False
food = True
q = 0
Else
Command7.Enabled = True
food = False
Combo4.Enabled = False
Text4.Enabled = False
Command3.Enabled = False
Command4.Enabled = False
Command5.Enabled = False
Command6.Enabled = False
End If
End Sub
Private Sub Command11_Click()
Combo6.Enabled = True
If Text7.Text = "" Or Text6.Text = "" Or Text5.Text = "" Then
MsgBox "Все поля должны быть заполнены!!!"
Exit Sub
End If
arBusNumber(LinesCount - 1, zzz) = LTrim(Str$(LinesCount - 1 + 1) + Combo5.List(zxz))
arDriveName(LinesCount - 1, zzz) = Text6.Text
arConductorName(LinesCount - 1, zzz) = Text5.Text
Combo6.AddItem arBusNumber(LinesCount - 1, zzz)
Combo5.RemoveItem Mi
zzz = zzz + 1
End Sub
Private Sub Command12_Click()
IfLen(Dir("c:\ Курсовая моя\Свободные автобусы.txt")) = 0 Then