Разработка приложения для Windows, представляющего собой динамическую информацию о наличии автобусов в автобусном парке

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    498,44 Кб
  • Опубликовано:
    2014-09-06
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка приложения для Windows, представляющего собой динамическую информацию о наличии автобусов в автобусном парке

Оглавление

 

1. Разработка эскизного и технического проектов программы

1.1 Введение

1.2 Назначение и область применения

1.3 Технические характеристики

Выбор состава технических и программных средств

1.4 Разработка программы

2. Разработка рабочего проекта

2.1 Спецификация программы

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

2.3 Описание программы

2.4 Тестирование программы

Литература

 

1. Разработка эскизного и технического проектов программы


1.1 Введение


Задание на курсовую работу по дисциплине "Алгоритмические языки и программирование".

Тема: Разработка приложения для Windows, представляющего собой динамическую информацию о наличии автобусов в автобусном парке.

Условие задачи:

Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке. Сведения о каждом автобусе включает:

·        номер автобуса;

·        фамилию и инициалы водителя;

·        номер маршрута.

Программа должна обеспечивать:

·        начальное формирование данных обо всех автобусах в парке в виде списка;

·        при выезде каждого автобуса из парка вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся в парке, и записывает эти данные в список автобусов, находящихся на маршруте;

·        при въезде каждого автобуса в парк вводится номер автобуса, и программа удаляет данные об этом автобусе из списков автобусов, находящихся на маршруте, и записывает эти данные в список автобусов, находящихся в парке;

·        по запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящихся на маршруте.

1.2 Назначение и область применения


Программа предназначена для сбора и анализа информации об автобусах на парковке.

Область применения: Транспортные компании, частные компании по перевозке пассажиров.

 

1.3 Технические характеристики


Постановка задачи

Необходимо разработать программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке. Приложение должно формировать начальный список автобусов (его можно загрузить из текстового файла или создать вручную), предоставлять пользователю возможность ввести новый автобус, отредактировать или удалить существующий. При выезде автобуса из парка он удаляется из списка автобусов в парке и вносится в список автобусов на маршруте, при въезде в парк автобус удаляется из списка машин на маршрутах и вносится в список автобусов в парке. Номер автобуса вводится не вручную, а посредством выбора строки с нужной машиной в таблице формы. Это позволит исключить ошибки при вводе номера.

По запросу можно посмотреть сведения об автобусах в парке или на маршруте. Выбор нужного варианта производится с помощью кнопок на форме.

Описание алгоритма

Обобщенный алгоритм в словесной форме записывается следующим образом:

)        Загрузка списка автобусов из файла.

2)      Если список не загружен, автобусы вводятся вручную.

)        Ввод данных.

)        Редактирование данных.

)        Удаление автобуса

)        Выезд автобуса из парка.

)        Въезд автобуса в парк.

)        Просмотр сведений.

)        Сохранение базы в файл.

)        Если файл не найден, предупреждение и возврат.

)        Выход из программы.

Пункты с третьего по девятый можно выполнять в произвольном порядке. Для выбора вариантов действия можно использовать кнопки и главное меню.

Загрузка из файла производится после запуска программы. Файл "bus. txt" должен находиться в одном каталоге с исполняемым файлом. Если файл найден, и в нем есть информация, то эта информация отражается в таблице "Автобусы в парке", то есть все автобусы на момент начала работы находятся в одном списке - списке парка. Если файл пустой, то таблица не заполняется.

При добавлении нового элемента нужно внести в поля формы ввода номер автобуса, ФИО водителя и номер маршрута. В зависимости от режима просмотра (автобусы в парке или на маршрутах) автобус добавится в список парка или на маршрутах. Удаляется автобус также из того списка, который открыт. Для выбора номера автобуса нужно выделить строку в таблице.

Если просматривается список автобусов в парке, то их можно отправить на маршрут, но кнопка и пункт меню, позволяющие направить в парк, недоступны, так автобус и так в парке. Соответственно, при просмотре автобусов на маршруте их можно только вернуть в парк, но не направить на линию.

Режим просмотра можно выбрать с помощью кнопок и пунктов меню ("Автобусы в парке" и "Автобусы на маршрутах"). В таблице появится информация об автобусах в парке или на маршрутах.

После всех изменений информацию можно сохранить в файл "bus. txt". Сохраняются данные из обоих списков вне зависимости от режима просмотра. При следующем запуске программы все автобусы из файла будут добавлены к списку парка.

При завершении работы программы автоматического сохранения не производится.

Блок-схема алгоритма приведена в Приложении А.

Организация входных и выходных данных программы

В приложении входными данными являются текстовый файл "bus. txt" и сведения об автобусах (номер автобуса, фамилия и инициалы водителя, номер маршрута), выходными - текстовый файл "bus. txt".

1.4 Выбор состава технических и программных средств


Для нормального функционирования разрабатываемой программы достаточно любого минимального набора современных технических средств. Программа потребляет минимальное количество системных ресурсов и может быть запущена на любой современной вычислительной машине под управлением операционной системы Windows.

Так как программа предназначается для использования в операционной среде Windows, то для разработки можно использовать интегрированную среду разработки C++Builder. C++Builder 6 - это объектно-ориентированная среда визуального программирования (RAD - Rapid Application Development), основанная на языке С++. Она предназначена для ускоренной разработки высокопроизводительных 32-битных приложений, которые могут работать в среде Windows. При этом C++Builder позволяет свести к минимуму объем вводимого вручную программного кода. В состав C++Builder входят множество средств, необходимых для разработки, тестирования и установки приложений, включая обширную библиотеку компонентов (VCL - Visual Components Library), средства визуального проектирования, шаблоны приложений и форм, а также различные мастера.

Минимальные требования для работы C++Builder 6 и программ, созданных в этой среде (ориентированные на доступные в данный момент комплектующие):

-       Любой современный процессор Intel / AMD;

-       ОЗУ от 512 Мбайт;

-       Жесткий диск объемом 80 Гбайт;

-       Монитор.

 

1.4 Разработка программы


Для разработки приложения используется среда визуального программирования C++Builder 6. Проект программы содержит два окна:

1.      frmMain - главная форма программы.

2.      frmBus - форма ввода или редактирования сведений об автобусе.

Окно frmMain. Главная форма программы в процессе работы приложения представлена на рис.1. Главная форма программы в процессе разработки приложения представлена на рис.2.

Рис.1. - Главная форма программы в процессе работы приложения

Рис.2. - Главная форма в процессе разработки

Компонент frmMain.

Свойства:= [biSystemMenu, biMinimize]= Автобусный парк= 680= 495= poDesctopCenter= MainMenu1

. Компонент TBevel Bevel2 - используется как элемент оформления.

. Надпись TLabel Label1, выводит название программы.

Caption = Автобусный парк

3. Надпись TLabel Label2, выводит назначение программы.

Caption = программа для учета автобусов в парке и на маршрутах.

. Надпись TLabel lblBus, выводит пояснение к таблице и обозначение режима просмотра.

. Таблица TStringGrid sgBus. Содержит сведения об автобусах.

. Кнопка TButton btnExit. Служит для завершения работы.

Caption = Выйти из программы.

. Панель TPanel Panel1, используется для оформления, свойства стандартные.

8. Кнопка TButton btnIn. Используется для направления автобуса в парк.

. Кнопка TButton btnOut. Используется для направления автобуса на маршрут.

. Кнопка TButton busRoute. Используется для просмотра автобусов на маршрутах.

. Кнопка TButton busPark. Используется для просмотра автобусов в парке.

. Кнопка TButton btnSave. Используется для сохранения информации в файл.

. Кнопка TButton btnEdit. Используется для редактирования сведений об автобусах.

. Кнопка TButton btnDelBus. Используется для удаления автобусов.

. Кнопка TButton btnAddBus. Используется для добавления автобусов.

. Компонент TImage Image1 контейнер для рисунка.

. Компонент MainMenu1: TMainMenu.

Рисунок 3. Компонент MainMenu1 при разработке

Окно frmBus. Форма для добавления или редактирования сведений об автобусах (рис 4).

Рис.4. Форма frmBus в процессе разработки

Компонент frmBus.

Свойства:= [biSystemMenu, biMinimize]= Автобусы= 448= 237= poDesctopCenter

1. Надпись TLabel Label1, выводит пояснение к полю ввода.

. Надпись TLabel Label2, выводит пояснение к полю ввода.

. Надпись TLabel Label3, выводит пояснение к полю ввода.

. Компонент TBevel Bevel1 - используется как элемент оформления.

. Кнопка TButton btnSave. Используется для закрытия формы при успешном вводе сведений.

. Кнопка TButton btnCancel. Используется для закрытия формы без сохранения данных.

. Поле с маской TMaskEdit medRoute, используется для ввода номера маршрута.

Hint = Необходимо ввести 3 цифры (например, 001)

ShowHint = true.

. Поле ввода TEdit edFIO, используется для ввода фамилии и инициалов водителя.

. Поле с маской TMaskEdit medNumBus, используется для ввода номера автобуса.

Hint = Необходимо ввести 3 цифры (например, 001)

ShowHint = true.

приложение алгоритм программа визуальный

2. Разработка рабочего проекта


2.1 Спецификация программы


Исполняемый файл приложения "Автобусный парк” имеет название Bus. exe и расположен на жестком диске (компакт-диске, дискете) в каталоге \Bus. Состав проекта:

Наименование

Обозначение

Примечание

bus. bpr

Файл проекта

Связывает все файлы, из которых состоит приложение

bus. cpp

Файл программного модуля проекта


bus,jpg

Рисунок

Предназначается для вывода изображения в главной форме

bus. obj

Объектный файл для bus. cpp

Откомпилированная версия bus. cpp

bus. res

Файл ресурсов

Содержит пиктограммы, графические изображения

bus. tds

Таблица символов Turbo Debugger


bus. txt

Файл базы данных

Содержит сведения об автобусах

BusFrm. cpp

Файл программного модуля для формы "Автобусы"

Определяет функциональность формы "Автобусы"

BusFrm. ddp

Вспомогательный файл модуля

Определяет вспомогательные файлы модуля BusFrm. cpp

BusFrm. dfm

Файл формы "Автобусы"

Содержит список свойств всех компонентов, включенных в форму "Автобусы"

BusFrm. h

Файл заголовка для BusFrm. cpp

Содержит объявления классов и функций

BusFrm. obj

Объектный файл для BusFrm. cpp

Откомпилированная версия BusFrm. cpp

MainFrm. cpp

Файл программного модуля для главной формы

Определяет функциональность главной формы

MainFrm. ddp

Вспомогательный файл модуля

Определяет вспомогательные файлы модуля MainFrm. cpp

MainFrm. dfm

Файл главной формы

Содержит список свойств всех компонентов, включенных в главную форму

MainFrm. h

Файл заголовка для MainFrm. cpp

Содержит объявления классов и функций

MainFrm. obj

Объектный файл для MainFrm. cpp

Откомпилированная версия MainFrm. cpp

 

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


Текст файла bus. cpp

#include <vcl. h>

#pragma hdrstop

// ---------------------------------------------------------------------------("MainFrm. cpp", frmMain);("BusFrm. cpp", frmBus);

// ---------------------------------------------------------------------------WinMain (HINSTANCE, HINSTANCE, LPSTR, int)

{

{>Initialize ();>CreateForm (__classid (TfrmMain), &frmMain);>CreateForm (__classid (TfrmBus), &frmBus);>Run ();

}(Exception &exception)

{>ShowException (&exception);

}(.)

{

{Exception ("");

}(Exception &exception)

{>ShowException (&exception);

}

}0;

}

Текст файла MainFrm. h

#ifndef MainFrmH

#define MainFrmH

// ---------------------------------------------------------------------------

#include <Classes. hpp>

#include <Controls. hpp>

#include <StdCtrls. hpp>

#include <Forms. hpp>

#include <ExtCtrls. hpp>

#include <jpeg. hpp>

#include <Menus. hpp>

#include <Grids. hpp>

// ---------------------------------------------------------------------------TfrmMain: public TForm

{

__published: // IDE-managed Components*Image1;*Label1;*Label2;*MainMenu1;*N1;*N3;*N4;*N5;*N6;*NRoute;*NPark;*N9;*N10;*N11;*N12;*Panel1;*Bevel1;*sgBus;*btnExit;*btnAddBus;*btnDelBus;*btnSave;*busPark;*busRoute;*lblBus;*btnEdit;*btnOut;*btnIn;*N2;*N13;*N14;*N15;*Bevel2;__fastcall N12Click (TObject *Sender);__fastcall btnAddBusClick (TObject *Sender);__fastcall btnDelBusClick (TObject *Sender);__fastcall btnSaveClick (TObject *Sender);__fastcall busParkClick (TObject *Sender);__fastcall busRouteClick (TObject *Sender);__fastcall btnEditClick (TObject *Sender);__fastcall btnOutClick (TObject *Sender);__fastcall btnInClick (TObject *Sender);: // User declarations: // User declarations

__fastcall TfrmMain (TComponent* Owner);mode; // режим вывода: 1 - в парке, 2 - на маршруте

}; int l_FIO = 30;

// структура автобус

struct Bus{numBus; // номер автобуса FIO [l_FIO]; // ФИО водителя

int route; // номер маршрута

Bus* next; // следующий элемент

};* __fastcall add (Bus* beg, const Bus& bus);* __fastcall find (Bus* pv, int num, Bus** prev);__fastcall print_dbase (Bus* beg);__fastcall editBus (Bus* beg, int numbus);* __fastcall read_dbase (char* filename);__fastcall new_bus ();__fastcall write_dbase (char *filename, Bus *park, Bus *route);* __fastcall remove (int num, Bus* beg);

// ---------------------------------------------------------------------------PACKAGE TfrmMain *frmMain;

// ---------------------------------------------------------------------------

#endif

Текст файла MainFrm. cpp

// ---------------------------------------------------------------------------

#include <vcl. h>

#include "stdio. h"

#pragma hdrstop

#include "MainFrm. h"

#include "BusFrm. h"

// ---------------------------------------------------------------------------

#pragma package (smart_init)

#pragma resource "*. dfm"*frmMain; *beg; // начало списка машин в парке

Bus *beg_r; // начало списка машин на маршруте

// Функция - присоединение автобуса к нужному списку

// возвращает указатель на начало списка

// принимает указатель на начало и присоединяемый автобус

Bus* __fastcall add (Bus* beg, const Bus& bus)

{*pv = new Bus;

*pv = bus;->next = 0;

if (beg) // список не пуст

{* temp = beg;(temp->next)= temp->next;>next = pv;

}

else // список был пуст, поэтому началом сейчас является

// присоединяемый автобус

beg = pv;

return beg;

}

// поиск автобуса в списке по номеру перебором всех элементов списка

// возвращает указатель на найденный автобус или 0, если не найден

// принимает указатель на начало списка, номер автобуса и указатель на элемент,

// предшествующий найденному* __fastcall find (Bus* pv, int num, Bus** prev)

{

*prev = 0;(pv)

{(pv->numBus == num)

{pv;

}

*prev = pv;= pv->next;

}0;

}__fastcall find_bus (Bus* beg, int numbus)

{

}

// вывод списка автобусов на экран

// принимает указатель на начало списка

void __fastcall print_dbase (Bus* beg)

{* pv = beg;i = 0;>sgBus->RowCount = 2; // очищаем сетку>sgBus->Cells [0] [1] = "";>sgBus->Cells [1] [1] = "";>sgBus->Cells [2] [1] = "";(! beg) return; // список пуст(pv)

{++;>sgBus->Cells [0] [i] = IntToStr (pv->numBus);>sgBus->Cells [1] [i] = pv->FIO;>sgBus->Cells [2] [i] = IntToStr (pv->route);>sgBus->RowCount = frmMain->sgBus->RowCount + 1;= pv->next;

}>sgBus->RowCount = frmMain->sgBus->RowCount - 1;

}

// редактирование автобуса

// принимает указатель на начало списка и номер автобуса

int __fastcall editBus (Bus* beg, int numbus) // корректировка

{* prev;* pv = find (beg, numbus, &prev);i;(! pv) return 1; // не найден

// заполняем поля формы старыми значениями из структуры

frmBus->medNumBus->Text = IntToStr (pv->numBus);>edFIO->Text = pv->FIO;>medRoute->Text = IntToStr (pv->route);>ShowModal ();(frmBus->ModalResult == mrOk)

{

// заполняем структуру новыми значениями>numBus = StrToInt (Trim (frmBus->medNumBus->Text));(pv->FIO,frmBus->edFIO->Text. c_str ());(i = strlen (pv->FIO); i<l_FIO; i++)>FIO [i] = ' ';>FIO [l_FIO - 1] = '\0';>route = StrToInt (Trim (frmBus->medRoute->Text));

}

return 0;

}

// загрузка бд из файла

// принимает название файла

// возвращает указатель на начало списка

Bus* __fastcall read_dbase (char* filename)

{* fin;bus, *beg = 0;symbol;( (fin = fopen (filename, "r")) == 0)

{

ShowMessage ("Не найден файл базы данных");

return 0;

}

symbol=fgetc (fin);

if (symbol! =EOF) // если файл не пустой - вернемся к началу, если пустой - будет feof ()

fseek (fin, 0L, SEEK_SET); // и вернется указатель - 0

while (! feof (fin))

{

fscanf (fin, "%3d",&bus. numBus); // заполняем структуру

fgets (bus. FIO, l_FIO, fin);

fscanf (fin, "%3d\n",&bus. route); = add (beg, bus); // присоединяем к списку

}

if (feof (fin)) // конец файла(fin); // закроем файлbeg;

}

// создание нового автобуса

// функция возвращает структуру автобус

Bus __fastcall new_bus ()

{bus; i;

// Очищаем поля ввода в форме создания автобуса

frmBus->medNumBus->Text = "";>edFIO->Text = "";>medRoute->Text = "";>ShowModal (); (frmBus->ModalResult == mrOk)

{

// заполняем структуру введенными значениями

bus. numBus = StrToInt (Trim (frmBus->medNumBus->Text));(bus. FIO, frmBus->edFIO->Text. c_str ());(i = strlen (bus. FIO); i<l_FIO; i++). FIO [i] = ' ';. FIO [l_FIO - 1] = '\0';. route = StrToInt (frmBus->medRoute->Text);

}

return bus;

}

// запись обоих списков в один файл автобусов

// при открытии программы в след. раз они все будут в парке

// функция принимает название файла, указатели на начало обоих списков

int __fastcall write_dbase (char *filename, Bus *park, Bus *route)

{

FILE *fout; // открываем файл для записи

if ( (fout = fopen (filename, "w")) == NULL) // файла нет

{

// ShowMessage ("Ошибка открытия файла для записи"));

return 1;

}

// fseek (fout, 0L, SEEK_SET); (park) // выбираем машины из парка

{(fout, "%03d%s%03d\n", park->numBus, park->FIO, park->route); = park->next;

}

while (route) // выбираем машины на линии

{(fout, "%03d%s%03d\n", route->numBus, route->FIO, route->route);= route->next;

}(fout); // закрываем файл 0;

}

// удаление автобуса из списка

// функция принимает значения - номер автобуса, указатель на начало списка

// возвращаеет указатель на начало списка

Bus* __fastcall remove (int num, Bus* beg)

{* prev;* pv = find (beg, num, &prev); // ищем по номеру (pv) // найден

{

if (pv == beg) // начало списка

beg = beg->next;

else // удаление из середины или конца списка

prev->next = pv->next;pv;

}beg;

}

// ---------------------------------------------------------------------------

// создание главной формы

__fastcall TfrmMain:: TfrmMain (TComponent* Owner)

: TForm (Owner)

{= 1;>Cells [0] [0] = "Номер автобуса";>Cells [1] [0] = "Водитель";>Cells [2] [0] = "Номер маршрута";= read_dbase ("bus. txt"); // считываем базу из файла(! beg)

{= NULL;

}_dbase (beg); // выводим на экран_r = NULL;

}

// ---------------------------------------------------------------------------__fastcall TfrmMain:: N12Click (TObject *Sender)

{>Terminate ();

}

// ---------------------------------------------------------------------------

// кнопка Добавить автобус__fastcall TfrmMain:: btnAddBusClick (TObject *Sender)

{

if (mode==1) // если это список в парке

{

beg = add (beg, new_bus ()); // то присоединяем структуру к списку парка

print_dbase (beg); // выводим на экран обновленную базу

}

else

{

beg_r = add (beg_r, new_bus ()); // иначе к списку машин на маршрутах

print_dbase (beg_r); // выводим на экран обновленную базу

}

// ---------------------------------------------------------------------------

// кнопка Удалить автобус__fastcall TfrmMain:: btnDelBusClick (TObject *Sender)

{num;( (sgBus->Row > 0) && (sgBus->Row < sgBus->RowCount)) // если строка сетки выбрана

{= StrToInt (sgBus->Cells [0] [sgBus->Row]); // номер автобуса в первой ячейке (mode==1) // если это список в парке

{

beg = remove (num, beg); // то удаляем структуру из списка парка

print_dbase (beg); // выводим на экран обновленную базу

}

else

{

beg_r = remove (num, beg_r); // иначе из списка машин на маршрутах

print_dbase (beg_r);

}

}

}

// ---------------------------------------------------------------------------

// Кнопка Записать в файл

void __fastcall TfrmMain:: btnSaveClick (TObject *Sender)

{(! write_dbase ("bus. txt",beg,beg_r)) ShowMessage ("База записана");

}

// ---------------------------------------------------------------------------

// Кнопка Автобусы в парке__fastcall TfrmMain:: busParkClick (TObject *Sender)

{= 1;>lblBus->Caption = "Автобусы в парке: ";_dbase (beg); // печатаем список парка

btnIn->Enabled = false; // кнопка Направить в парк недоступна

btnOut->Enabled = true; // кнопка Направить на маршрут доступна

NPark->Enabled = false; // пункт меню Направить в парк

NRoute->Enabled = true; // пункт меню Направить на маршрут

}

// ---------------------------------------------------------------------------

// Кнопка автобусы на маршруте__fastcall TfrmMain:: busRouteClick (TObject *Sender)

{= 2;>lblBus->Caption = "Автобусы на маршруте: ";_dbase (beg_r); // показ списка машин на линии

btnIn->Enabled = true; // кнопка Направить в парк доступна

btnOut->Enabled = false; // кнопка Направить на маршрут недоступна

NPark->Enabled = true; // меню>Enabled = false;

}

// ---------------------------------------------------------------------------

// Кнопка Редактировать данные__fastcall TfrmMain:: btnEditClick (TObject *Sender)

{num;( (sgBus->Row > 0) && (sgBus->Row < sgBus->RowCount)) // если выбрана строка в сетке

{= StrToInt (Trim (sgBus->Cells [0] [sgBus->Row])); // номер автобуса из первой ячейки(mode==1) // выбранной строки

{(beg, num); // список парка_dbase (beg);

}

{(beg_r, num); // список маршрутов_dbase (beg_r);

}

}

}

// ---------------------------------------------------------------------------

// кнопка Направить на маршрут

void __fastcall TfrmMain:: btnOutClick (TObject *Sender)

{* prev;num;( (sgBus->Row > 0) && (sgBus->Row < sgBus->RowCount))

{= StrToInt (Trim (sgBus->Cells [0] [sgBus->Row]));* pv = find (beg, num, &prev); // ищем по номеру в списке парка

if (pv) // найден

{

if (pv == beg) // начало списка

beg = beg->next; // устанавливаем указатель на начало на след. элемент

else // удаление из середины или конца списка

prev->next = pv->next; // связываем предыдущий и следующий элементы

beg_r = add (beg_r, *pv); // привязываем элемент к другому списку - машин на маршрутах

}

print_dbase (beg);

}

}

// ---------------------------------------------------------------------------

// Кнопка Направить в парк

// делает то же самое, что и предыдущая функция, но наоборот -

// переносит из списка на маршрутах в список парка

void __fastcall TfrmMain:: btnInClick (TObject *Sender)

{num;( (sgBus->Row > 0) && (sgBus->Row < sgBus->RowCount))

{= StrToInt (sgBus->Cells [0] [sgBus->Row]);* prev;* pv = find (beg_r, num, &prev); // ищем по номеру (pv) // найден

{

if (pv == beg_r) // начало списка

beg_r = beg_r->next; // удаление из середины или конца списка

prev->next = pv->next;= add (beg, *pv);

}_dbase (beg_r);

}

}

// ---------------------------------------------------------------------------

Текст файла BusFrm. h

// ---------------------------------------------------------------------------

#ifndef BusFrmH

#define BusFrmH

// ---------------------------------------------------------------------------

#include <Classes. hpp>

#include <Controls. hpp>

#include <StdCtrls. hpp>

#include <Forms. hpp>

#include <ExtCtrls. hpp>

#include <Mask. hpp>

// ---------------------------------------------------------------------------TfrmBus: public TForm

{

__published: // IDE-managed Components*Label1;*medNumBus;*Bevel1;*Label2;*medRoute;*Label3;*edFIO;*btnSave;*btnCancel;__fastcall btnSaveClick (TObject *Sender);: // User declarations: // User declarations

__fastcall TfrmBus (TComponent* Owner);

};

// ---------------------------------------------------------------------------PACKAGE TfrmBus *frmBus;

// ---------------------------------------------------------------------------

#endif

Текст файла BusFrm. cpp

// ---------------------------------------------------------------------------

#include <vcl. h>

#pragma hdrstop

#include "BusFrm. h"

// ---------------------------------------------------------------------------

#pragma package (smart_init)

#pragma resource "*. dfm"*frmBus;

// ---------------------------------------------------------------------------

__fastcall TfrmBus:: TfrmBus (TComponent* Owner)

: TForm (Owner)

{

}

// ---------------------------------------------------------------------------__fastcall TfrmBus:: btnSaveClick (TObject *Sender)

{(medNumBus->Text=="")

{("Не введен номер автобуса");;

}(edFIO->Text=="")

{("Не введены данные водителя");;

}(medRoute->Text=="")

{("Не введен номер маршрута");;

}

}

// ---------------------------------------------------------------------------

 

2.3 Описание программы


Для функционирования приложения "Автобусный парк" необходимо наличие на компьютере установленной операционной системы Windows 2000/XP/Vista.

Программа запускается с помощью запуска файла bus. exe, находящегося в каталоге X: /bus (X - имя диска, на который записывается приложение).

После запуска загружаются сведения из файла базы данных. Если файл не пуст, то загруженные данные будут помещены в таблицу и выведены на экран. Далее пользователь может добавлять, редактировать, удалять и просматривать сведения об автобусах на линии и в парке. Можно направить автобус на маршрут или вернуть в парк. При этом меняется содержание таблицы на экране. Можно базу данных с учетом всех изменений сохранить в файл. Все действия можно осуществлять с помощью кнопок и пунктов меню. Для завершения работы нужно выбрать соответствующий пункт меню или нажать кнопку "Выйти из программы".

Сведения об автобусах имеют ограничения: номер маршрута и номер автобуса представляют собой целое число размеров не более трех цифр. Фамилия и инициалы водителя должны быть не длиннее 29 символов. Это нужно для исключения ошибок при форматированном вводе-выводе данных в файл и из файла. Количество автобусов строгими рамками не ограничено, так как в программе используются динамические структуры данных - списки.

Описание логической структуры.

Для хранения базы данных воспользуемся односвязными списками. Каждый элемент включает информационную часть (номер автобуса, ФИО водиетля и номер маршрута) и указатель на следующий элемент. Признак конца списка - ноль в поле указателя. Список доступен через указатель на его первый элемент.

Создадим два списка для хранения элементов. Один содержит информацию об автобусах в парке, другой на маршруте. Список автобусов на маршруте изначально пуст, поэтому указатель на его начало обнуляется. Указатель на начало списка парка устанавливается после загрузки первого элемента из файла. Если файл пуст, то указатель тоже обнуляется.

Чтение информации из базы производится с помощью функции Bus* __fastcall read_dbase (char* filename). Функция построчно считывает информацию из файла и заполняет поля структуры. Затем созданная структура включается в список автобусов в парке. Пока не достигнут конец файла, процесс продолжается.

Ввод нового элемента осуществляется двумя функциями: Bus __fastcall new_bus () и Bus* __fastcall add (Bus* beg, const Bus& bus). В функции new_bus () создается элемент структуры, с помощью формы "Автобусы" заполняются все поля, затем в функции add (Bus* beg, const Bus& bus) эта структура присоединяется к нужному списку. Параметры, которая принимает функция - указатель на начало списка и заполненная структура.

Для редактирования сведений об автобусе используются функции int __fastcall editBus (Bus* beg, int numbus) и Bus* __fastcall find (Bus* pv, int num, Bus** prev). Функция find осуществляет поиск элемента в списке по номеру автобуса и возвращает указатель на найденный элемент или нуль, если элемент не найден. Функция принимает в качестве параметров номер автобуса и указатель на начало списка, в котором нужно искать. Указатель на найденный элемент возвращается в функцию editBus, где редактируются поля структуры.

Для удаления элемента используется функция Bus* __fastcall remove (int num, Bus* beg). Функция вызывает функцию find для поиска удаляемого элемента в списке. В функцию поиска передается указатель на начало списка, номер автобуса и адрес предыдущего элемента. Это необходимо, чтобы связать предыдущий и последующий элементы. Функция возвращает указатель найденного элемента или нуль. После исключения из списка нужного элемента он удаляется (delete pv).

Вывод на экран нужного списка реализуется в функции void __fastcall print_dbase (Bus* beg). Принимая указатель на начало списка, функция перебирает все элементы списка и выводит в таблицу на форме.

Вывод в файл осуществляет функция int __fastcall write_dbase (char *filename, Bus *park, Bus *route). В нее передается название файла и указатели на начало обоих списков. Для выгрузки информации используется форматированный вывод.

Все остальные функции - это методы компонентов C++Builder. Из этих методов вызываются нужные функции, которые описаны выше. Кнопка "Добавить автобус" вызывает функцию add (), кнопка "Редактировать" - определяет номер автобуса по таблице и вызывает editBus (), кнопка "Удалить автобус" - после определения номера вызывает remove (), кнопка "Сохранить в файл" - функцию write_dbase (), кнопки "Автобусы на маршруте" и "Автобусы в парке" вызывают функцию вывода на экран списков.

Кнопки "Направить на маршрут" и "Направить с парк" с помощью find () находит в списке нужный элемент, а затем переносит его в другой список, подключая к последнему элементу или устанавливая как начало списка, если тот был пуст. В прежнем списке к предыдущему элементу подключается следующий после перенесенного.

Используемые технические средства.

Для нормального функционирования программы необходим любой современный компьютер, цветной монитор, клавиатура, манипулятор типа "мышь".

Минимальные требования для работы программы:

Любой современный процессор Intel / AMD;

ОЗУ от 512 Мбайт.

Вызов и загрузка.

Приложение "Автобусный парк" может находиться в любом доступном каталоге любого диска (A,C,D,E и т.д.). Файл базы данных "bus. txt" должен находиться в одном каталоге с исполняемым файлом. Программа запускается файлом "bus. exe”.

Входные данные.

Исходные данные могут загружаться из файла или вводиться вручную. В файле данные хранятся построчно, поля каждой структуры находятся в одной строке, одно за другим. Поля номер автобуса и номер маршрута занимают по три символа, поле ФИО водителя - 29 символов. После загрузки программой будет добавлен еще символ конца строки.

Данные можно вносить с клавиатуры. При этом, номер автобуса и номер автобуса - это целые числа из трех цифр, а ФИО водителя - это символьный массив, который вводится в поле строка и преобразуется в массив программно при создании структуры.

Выходные данные имеют такой же формат и формируются и выгружаются в файл программно, если пользователь нажал соответствующую кнопку или выбрал пункт меню.

 

2.4 Тестирование программы

C++ Builder является средой быстрой разработки приложений. В основе систем быстрой разработки (RAD-систем, Rapid Application Development - среда быстрой paзpa6oтки приложений) лежит технология визуального проектирования и событийного программирования, суть которой заключается в том, что среда разработки берет на себя большую часть работы по генерации кода программы, оставляя программисту работу по конструированию диалоговых окон и написанию функций обработки событий. Производительность программиста при использовании RAD систем существенно увеличивается.

Система объектно-ориентированного программирования Borland C++ Builder, предназначена для операционных систем Windows. Интегрированная среда C++ Builder обеспечивает скорость визуальной разработки, продуктивность повторно используемых компонентов в сочетании с мощью языковых средств C++, усовершенствованными инструментами и разномасштабными средствами доступа к базам данных.

Профессиональные средства языка C++ интегрированы в визуальную среду разработки. C++Builder предоставляет быстродействующий компилятор с языка Borland C++, эффективный инкрементальный загрузчик и гибкие средства отладки как на уровне исходных инструкций, так и на уровне ассемблерных команд - в расчете удовлетворить высокие требования программистов-профессионалов.

С++ Builder может быть использован везде, где требуется дополнить существующие приложения расширенным стандартом языка C++, повысить быстродействие и придать пользовательскому интерфейсу качества профессионального уровня.

Средства отладки:

Local Variables - просмотр значений локальных переменных. Во время отладки очень часто приходиться просматривать значения переменных. Поскольку в объектно-ориентированном программировании очень мало глобальных переменных (большинство значений инкапсулировано в объектах), то очень удобно использовать для просмотра переменных Local Variables. Окно Local Variables открывается из меню "View" - "Debug Windows", через контекстное меню в редакторе кода или горячей клавишей Ctrl - Alt - L.

Debug Inspector - инспектор отладки. Через Debug Inspector можно не только просмотреть значения отдельных переменных, но и раскрывать в отдельном окне классы и структуры.

Call Stack - просмотр стека вызовов. Если в программе применялся полиморфизм или не известно, какой метод передает испорченные параметры, то Call Stack сможет помочь найти источник проблем. Call Stack покажет в каком порядке происходили вызовы методов и с какими параметрами они начинали работать. Окно Call Stack открывается из меню "View" - "Debug Windows", через контекстное меню в редакторе кода или горячей клавишей Ctrl - Alt - W.

При испытании программы нужно проверить правильность загрузки и выгрузки информации, установки правильных значений параметров элемента структуры при вводе нового автобуса, перемещение элемента из одного списка в другой.

Добавим новый автобус в список автобусов в парке, затем переведем его на маршрут. Значения:

номер автобуса 140;

ФИО водителя Окунев И. И,

номер маршрута 15.

Добавим новый автобус в список автобусов на маршруте, затем переведем его в парк. Значения:

номер автобуса 150;

ФИО водителя Щукин Э. П.;

номер маршрута 16.

Выгрузим в файл. В файле должны быть добавлены две новые строки.

Содержание файла bus. txt до загрузки программы:


Запускаем программу:


Добавим первый автобус:


Результат


Направим на маршрут:

Создадим автобус на маршруте:


И направим в парк. Результат действий:


Автобусы в парке.


Автобусы на маршруте.

Запишем:

Посмотрим содержание файла после записи базы данных:

 

Запустим программу еще раз:


Оба элемента находятся в списке автобусов в парке, то есть программа работает согласно заданию.

Литература


1.      Архангельский, А.Я. Программирование в С++ Builder 6.2-е изд. / А.Я. Архангельский. - М.: ООО "Бином-Пресс", 2005.

2.      Павловская Т.А. С/С++. Программирование на языке высокого уровня. Учебник. - СПб: Питер, 2006.

.        Павловская Т.А., Щупак Ю.А. С/С++. Программирование на языке высокого уровня. Структурное программирование. Практикум. - СПб: Питер, 2007.

Похожие работы на - Разработка приложения для Windows, представляющего собой динамическую информацию о наличии автобусов в автобусном парке

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!